承诺与for循环承诺

时间:2018-02-06 07:35:37

标签: javascript reactjs ecmascript-6 bluebird

我想调用多个api,第二个api需要来自第一个api的东西,我创建了两个承诺但是现在我被卡住了,我怎么能执行需要完成的事情并等待所有这些完成?

createAccount(this.state.item) //promise
.then(resp=>{

  this.state.albums.forEach(o=>{ //array of object
    createAlbum(resp.id, { //promise
      ...o
    })
  })
})

我正在使用bluebird我得到了一个提示,使用promise.all但我不知道如何使用forEach,我无法控制那里有多少张专辑。

3 个答案:

答案 0 :(得分:0)

听起来您想要创建帐户,然后创建存储在数组中的一些数量的相册。这确实是Promise.all的用途:

createAccount(this.state.item)
.then(resp =>
    Promise.all(
        this.state.albums.map(o => createAlbum(resp.id, o))
    )
);

您需要将then创建的承诺返回给调用者,或者处理错误(例如,通过.catch),这与promises一样。

有关the bluebird docson MDNPromise.all的详情。

答案 1 :(得分:0)

目前尚不清楚您想要什么,但如果您想处理每个相册,可以Promise.all使用Array.prototype.map,您的代码将如下所示:

//if this is part of a function you shoud
// return createAccount ...
createAccount(this.state.item) //promise
.then(
  resp=>//arrow function without {} will return first statement
        //resp=>Promise.all(... is same as resp=>{ return Promise.all(...
    Promise.all(
      this.state.albums.map(
        album=>{
          //not sure why you want to keep calling createAlbum
          //  but only have one id, did you want to do album.id?
          createAlbum(resp.id)
          .then(
            o=>{
              //do something with o, album or response, they are all available
              return album;//you acn for example return album
            }
          )
        }
      )  
    )
)
.then(
  results=>{
    //results is an array of whatever o=> returns
  }
).catch(
  error=>{
    console.warn("something went wrong:",error);
  }
);

如果您有任何疑问,请告诉我,可能需要:

  1. 您正在使用的代码
  2. 在代码中添加一些console.log("album is:",JSON.stringify(album,undefined,2)语句(相册就是一个例子)。因此,您可以自己调试一些代码,并确定您认为自己拥有的数据对象是否实际上是您拥有的对象。
  3. 您遇到的任何错误。在浏览器中按F12,然后查看控制台和网络选项卡。控制台将显示错误,您的console.logs和network将显示您的xhr错误/响应。

答案 2 :(得分:0)

使用promise.map而不是promise.all,查找下面的示例作为参考 -

Promise.map(this.state.albums, function(fileName) {
    // Promise.map awaits for returned promises as well.
    return x;
}).then(function() {
    console.log("Done");
});