首页 > 解决方案 > Promise.all 无法按预期使用数组

问题描述

这是我的代码,我从一个空数组开始,并想调用一个服务来处理填充的数组。我使用对服务的两次调用来填充数组,这些服务调用 API 来接收要插入到数组中的元素。

我正在尝试使用承诺来确保我的数组subscribers中充满了正确的订阅者对象,但是方法 processSubscribers 总是收到一个空数组,即使对象最终确实被添加到订阅者数组中(如 chrome 调试中所见)。

doSomething(){
    const subscribers: ISubscriber[] = [];
    const promises = [];

    this.selectedChildren.forEach(child => {
        promises.push(this.serviceA.getSubscribers(child.id).subscribe( (subs: ISubscriber[]) => {
            subs.forEach(s => {
                subscribers.push(s);
            });
        }));
    });

    this.selectedSubscribers.forEach(sub => {
        promises.push(this.serviceB.getSubscriber(sub.subscriberId).subscribe( (sub: ISubscriber) => {
            subscribers.push(sub);
        }));
    });

    // subscribers is always empty when this call is made 
    // since above code hasn't finished executing
    Promise.all(promises).then( a => {
        this.serviceC.processSubscribers(this.id, subscribers).subscribe( id => {
            this.toastr.success('Success!');
        });
    });
}

标签: angulartypescriptes6-promise

解决方案


这行代码的结果是订阅而不是承诺

this.serviceA.getSubscribers(child.id).subscribe( (subs: ISubscriber[]) => {
            subs.forEach(s => {
                subscribers.push(s);
            })

这意味着您的promise数组不包含承诺,这就是为什么promise.all不起作用

你可以这样做

promises.push(this.serviceB.getSubscriber(sub.subscriberId).toPromise())

或者

promises.push(this.serviceB.getSubscriber(sub.subscriberId).toPromise().then(x => ... ))

推荐阅读