私はes6を使用しており、次の約束をしています。私が望むのは、次のPromise.allが、前のPromise.allが完了してから次のPromise.allが実行されるまで待つことです。私は以下のコードで試してみましたが、うまくいきません。プロミス1だけが解決されています。promise.allをネストする方法
var deletePromises = [];
arr.menuItems.forEach((item, idx) => {
if (item.replace) {
deletePromises.push(deleteFromFirebase(user.uid, item));
}
});
// Promise 1
Promise.all(deletePromises).then(res1 => {
var uploadPromises = [], updateRecordPromises = [];
arr.menuItems.forEach((item, idx) => {
uploadPromises.push(uploadToFirebase(user.uid, item));
});
// Promise 2
Promise.all(uploadPromises).then(res2 => {
arr.menuItems.forEach((item, idx) => {
item.replace = false;
updateRecordPromises.push(updateRecord(user.uid, item));
});
// Promise 3
Promise.all(updateRecordPromises).then(res3 => {
console.log('All promise execute with successfully');
});
});
});
MarkMは
が示唆するが、まだそこに問題がマークとして連鎖を使用してみてください回答。私はどこに問題があったのかを知っていました。決して解決されずに決して呼び出されないuploadPromisesです。
uploadToFirebase機能は、ここではスタックが、ファイルが正常にアップロードされます。私はすべてのファイルを見ることができます。
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);
});
});
});
};
更新されたコード
はconsole.log( 'プリントRES2は、')
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);
});
'Promise.all'は、promise.allに渡されたPromiseがすべて解決されたときに解決される約束を返します。だから、普通の 'Promise'フローのように、' Promise.all'コールだけを 'then'することができます –
私はpromise2のconsole.logでデバッグしようとしています。それが完全に解決されたものの、それに入っていないようだが、promise2のconsole.logにしようとするが、何も印刷されていない。私はここで間違っていますか? – digit