Helpex - Trao đổi & giúp đỡ Đăng nhập
4

Tôi có một trường hợp mà tôi có thể cần hoặc không cần thêm vật có thể quan sát vào danh sách. Sau đó, tôi muốn forkJoincác vật có thể quan sát được để trang có thể tải khi tất cả dữ liệu có sẵn.

let observables: Observable<any>[] = [];

observables.push(this.taskService.getStep(this.housingTransactionId, this.task.stageReferenceId, this.task.stepReferenceId));

if (this.task.associatedChatThreadId) {
    observables.push(this.messageHubService.getChatThread(this.housingTransactionId, this.task.associatedChatThreadId));
}

if (this.task.associatedDocuments && this.task.associatedDocuments.length > 0) {
    this.task.associatedDocuments.forEach(documentId => {
        observables.push(this.documentHubService.getDocumentProperties(this.housingTransactionId, documentId));
    });
}

Observable.forkJoin(observables)
    .subscribe(([step, chatThread, ...documents]) => {

        this.step = step;           
        this.chatThread = chatThread;           
        this.documents = documents;

        this.isPageLoading = false;

    }, error => {
        this.isPageLoading = false;
        console.log(error);
    });

Vấn đề mà tôi đang gặp phải là nếu tôi không có this.task.associatedChatThreadId, thì cái có thể quan sát được sẽ không được thêm vào danh sách và khi forkJoinnó được thực thi, những cái đó ...documentssẽ ở vị trí của thuộc chatThreadtính trong phương thức đăng ký (tốt, tài liệu đầu tiên! ).

Có cách nào để đảm bảo vị trí của các câu trả lời từ a forkJoinkhông? Hay tôi / tôi có thể sử dụng một cách tiếp cận khác không?

4 hữu ích 0 bình luận 2.5k xem chia sẻ
10

Một cách dễ dàng nhất mà bạn có thể thêm một câm Observable.of(null)với nullgiá trị nếu tình trạng này không được đáp ứng để giữ nguyên trật tự của phản ứng:

if (this.task.associatedChatThreadId) {
    observables.push(this.messageHubService....);
} else {
    observables.push(Observable.of(null))
}

Sau đó, trong đăng ký, bạn có thể kiểm tra xem chatThread === nullnó có luôn hiện diện ở vị trí cũ hay không.

Ngoài ra, bạn có thể bao bọc mỗi Observable observablesvới một số đối tượng bổ sung sẽ làm cho nó có thể nhận dạng duy nhất trong người đăng ký nhưng điều đó sẽ phức tạp không cần thiết vì vậy cá nhân tôi sẽ bám vào tùy chọn đầu tiên.

10 hữu ích 1 bình luận chia sẻ
0

Một cách tiếp cận khác là không sử dụng FolkJoin mà đăng ký riêng lẻ. Đồng thời, tạo isPageLoading a BehaviorSubject để đếm số lượng yêu cầu không đồng bộ mà bạn hiện có. Mỗi khi bạn đưa ra yêu cầu, bạn có thể có isPageLoading.next (1) và isPageLoading.next (-1) khi bạn hoàn thành một yêu cầu.

0 hữu ích 1 bình luận chia sẻ
0

Bạn có thể tạo một hàm trợ giúp chấp nhận một đối tượng có các khóa chuỗi và các giá trị có thể quan sát được và trả về một đối tượng có thể quan sát sẽ phát ra một đối tượng có các khóa tương tự, nhưng có các giá trị kết quả thay vì các giá trị có thể quan sát được.

Tôi thực sự sẽ không nói rằng đây là một phiên bản sạch hơn so với việc sử dụng (null) như martin đề xuất, nhưng nó có thể là một sự thay thế.

function namedForkJoin(map: {[key: string]: Observable<any>}): Observable<{[key: string]: any}> {
    // Get object keys
    const keys = Object.keys(map);

    // If our observable map is empty, we want to return an empty object
    if (keys.length === 0) {
        return of({});
    }


    // Create a fork join operation out of the available observables
    const forkJoin$ = Observable.forkJoin(...keys.map(key => map[key]))

    return forkJoin$
        .map(array => {
            const result = {};
            for (let index = 0; index < keys.length; index++) {
                result[keys[index]] = array[index];
            }

        }));
}

Xin lưu ý rằng tôi không có góc hoặc rxjs nào chạy ở đây vào lúc này, vì vậy tôi không thể xác minh chức năng thực sự hoạt động. Nhưng ý tưởng là: 1. Lấy chìa khóa từ bản đồ đầu vào. 2. Sử dụng các phím để lấy một mảng các vật có thể quan sát và chuyển nó đến tham gia fork. 3. Thêm một hàm ánh xạ để chuyển đổi mảng kết quả trở lại thành một đối tượng.

0 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript angular typescript rxjs observable , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading