我想调用多个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,我无法控制那里有多少张专辑。
答案 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 docs和on MDN中Promise.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);
}
);
如果您有任何疑问,请告诉我,可能需要:
console.log("album is:",JSON.stringify(album,undefined,2)
语句(相册就是一个例子)。因此,您可以自己调试一些代码,并确定您认为自己拥有的数据对象是否实际上是您拥有的对象。答案 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");
});