2015-11-26 97 views
0

我有一個隊列,看起來像這樣火力地堡隊列 - 處理拒絕/解決在循環

new Queue(queueRef, options, ({post, user, postId}, progress, resolve, reject) => { 
    rootRef.child(`users/${user.user_id}/followers`).once('value', (snapshot) => { 
    const followers = toArray(snapshot.val()) 
    for (var i = 0; i < followers.length; i++) { 
     rootRef.child(`users/${followers[i].user_id}/feed/${postId}`).set(post, (err) => { 
     if (err) { 
      reject(err) 
     } else if (i >= followers.length - 1) { 
      resolve({post, user, postId}) 
     } 
     }) 
    } 
    }, reject) 
}) 

我的問題是,我真的只有一次解決所有的set■找完了,如果其中任何的拒絕失敗。我想要做的是以某種方式將循環的每次迭代傳遞給另一個隊列,然後可以針對該特定請求而不是整個集合。

回答

1

這看起來可能是XY problem,可能有更好的解決方案。但是你正在尋找類似Q.all()的東西。

本質上,調用一個方法來完成每個操作並返回一個promise,並在整個集合完成時解析/拒絕。

new Queue(queueRef, options, ({post, user, postId}, progress, resolve, reject) => { 
    rootRef.child(`users/${user.user_id}/followers`).once('value', (snapshot) => { 
    var promiseList = [], p; 
    const followers = toArray(snapshot.val()) 
    for (var i = 0; i < followers.length; i++) { 
     p = processNextFollower(followers[i]); 
     // p.then(progress); 
     promiseList.push(p); 
    } 
    Q.all(promiseList).then(resolve, reject); 
    }, reject) 
}) 

function processNextFollower(follower, postId) { 
    var def = Q.defer(); 
    rootRef.child(`users/${follower.user_id}/feed/${postId}`).set(post, (err) => { 
     if (err) { 
      def.reject(err) 
     } else if (i >= followers.length - 1) { 
      def.resolve({post, user, postId}) 
     } 
     }) 
    } 
    return def.promise; 
}