Typescript 承诺。一切都不会发生;我不能正常工作

Typescript 承诺。一切都不会发生;我不能正常工作,typescript,promise,Typescript,Promise,我有一个update方法,获取一些数据并返回一个承诺。 我想在一组带有Promise.all的数据上并行运行此方法。 但在调试它时,我发现它的行为并不像预期的那样 更新方法(Typescript)使用promisified Azure表服务,该服务还返回promise: public update(data: string): Promise<void> { // prepare data... return this._tableService.replaceEnt

我有一个
update
方法,获取一些数据并返回一个承诺。 我想在一组带有
Promise.all
的数据上并行运行此方法。 但在调试它时,我发现它的行为并不像预期的那样

更新方法(Typescript)使用promisified Azure表服务,该服务还返回promise:

public update(data: string): Promise<void> {
    // prepare data...
    return this._tableService.replaceEntity(TABLE_NAME, entity);
}
  • 推送后立即调用更新方法(不在Promise.all中),Promise立即解决

    var updatePromises = [];
    data.forEach(item => {          
       updatePromises.push(() => this.update(item));
    }
    return Promise.all(updatePromises);
    
    var updatePromises = [];
    data.forEach(item => {          
       updatePromises.push(this.update(item));
    }
    return Promise.all(updatePromises);
    

  • 诺兰·劳森(Nolan Lawson)在他的优秀作品中直接解决了两个代码示例的问题:

    所有这些的TLDR都是/
    forEach()
    /
    ,而
    不是您要寻找的构造。您希望[将
    .map()
    与]
    Promise.all()
    相结合

    使用他的例子(以及上面Bergi的评论)作为模型,您可以通过

  • Promise.all()
    中创建承诺数组:


  • 如果您的
    update
    函数是同步的(没有任何
    wait
    s或延迟回调来解析承诺),那么承诺将在您调用该函数时立即解析。不,它是异步的并使用promise扫描您发布的代码?顺便说一句,使用
    map
    而不是
    forEach
    承诺是渴望而不是懒惰的,你不能让他们同时开始,你只能带着承诺等待他们
    return Promise.all(data.map(item => this.update(item)))