2017-07-02 4 views
0

私は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); 
}); 
+0

'Promise.all'は、promise.allに渡されたPromiseがすべて解決されたときに解決される約束を返します。だから、普通の 'Promise'フローのように、' Promise.all'コールだけを 'then'することができます –

+0

私はpromise2のconsole.logでデバッグしようとしています。それが完全に解決されたものの、それに入っていないようだが、promise2のconsole.logにしようとするが、何も印刷されていない。私はここで間違っていますか? – digit

答えて

0

解決策が見つかりました。なぜなら、menuItemsの配列の1つであるprop - > new_filenameは空であるから、約束が決して解決されないからです。だから、アイテムの小道具ごとに空のチェックを追加するだけで、約束が正しく解決されました。答えのための@MarkMに感謝します。今や、ネストされた約束と比べて、コードははるかにクリーンで読みやすくなりました。

Promise.all(deletePromises) 
.then(res1 => { 
    console.log("Print res1:", res1); 
    arr.menuItems.forEach((item, idx) => { 
    if (!isEmpty(item.new_filename)) { 
     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); 
}); 
+0

うれしいことです。 –

3

が印刷されていないあなたが巣に約束を必要としない、あなたの新しい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)) 
+0

更新された質問をご覧ください。 – digit

関連する問題