我使用es6并有以下承诺。我想要的是下一个Promise.all等待之前的Promise.all在执行下一个之前完成。我尝试使用以下代码,但它没有工作,只有Promise 1得到解决。
const uploadToFirebase = (userid, item) => {
return new Promise((resolve, reject) => {
const uploadUri = Platform.OS === "ios"
? RNFetchBlob.wrap(item.pic_url.replace("file://", ""))
: RNFetchBlob.wrap(item.pic_url);
Blob.build(uploadUri, {
type: "image/png;"
}).then(blob => {
// upload image using Firebase SDK
firebase
.storage()
.ref("menu_items")
.child(userid)
.child(item.new_filename)
.put(blob, { contentType: "image/png" })
.then(snapshot => {
console.log("Promise resolve: ", snapshot);
resolve(snapshot);
blob.close();
})
.catch(error => {
reject(error.message);
});
});
});
};
MarkM回答
尝试使用链接作为Mark建议,但问题仍然存在。我找到了问题所在,是uploadPromises从未得到解决,然后永远不会被调用。
uploadToFirebase功能
被困在这里,但文件已成功上传。我可以看到所有文件。
var deletePromises = [],
uploadPromises = [],
updateRecordPromises = [];
arr.menuItems.forEach((item, idx) => {
if (item.replace) {
deletePromises.push(deleteFromFirebase(user.uid, item));
}
});
Promise.all(deletePromises)
.then(res1 => {
console.log("Print res1:", res1);
arr.menuItems.forEach((item, idx) => {
uploadPromises.push(uploadToFirebase(user.uid, item));
});
return Promise.all(uploadPromises);
})
.then(res2 => {
console.log("Print res2:", res2);
dispatch({ type: MENU_UPDATE_SUCCESS, payload: arr });
dispatch(reset("menuItem"));
})
.catch(error => {
console.log("Print error:", error);
});
更新了代码
console.log('打印res2')未打印
{{1}}
答案 0 :(得分:3)
您无需嵌套Promise,您可以从Promise.all
返回新的then()
,这样您就可以将它们链接起来。更简单的例子:
var arr = [1, 2, 3, 4, 5, 6]
function slowF(i) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(i), i*200)
})
}
var p = arr.map((i) => slowF(i))
Promise.all(p)
.then((p) => {
console.log("In first Promise.all resolving: ", p)
var newP = p.map(i => slowF(i) )
return Promise.all(newP)
})
.then((p)=>{
console.log("In second Promise.all resolving: ", p)
})
.catch((e) => console.log("error: ", e))
答案 1 :(得分:0)
我找到了解决方案。这是因为menuItems数组之一prop - > new_filename为空,这就是为什么promise永远不会得到解决。所以,我只需要为每个项目道具添加空检查,然后正确解决了承诺。感谢@MarkM的回答。现在,与嵌套的promise相比,代码更清晰,更易于阅读。
a / b