2017-01-14 151 views
0

我無法找到解決方案。下面是我在做什麼:承諾與async.each無法正常工作

async.each(bottles, function(bottle) { 
     // set substance quantity to 0 
     updateQuantity(bottle[constant.SUBSTANCE_ID], 0) 
      .then(function() { 
       bottle[constant.EXPIRY] = expiry; 
       bottle[constant.IS_AVAILABLE] = true; 

       updateRecord(bottle) 
        .then(function() { 
         console.log('Updated'); 
        }, 
        function() {}); 
      }, function() {}); 
    }, function() { 
     console.log('Finished'); 
    }); 
    console.log('Done'); 

的方法updateQuantity和updateRecord返回承諾和使用Knex更新中也返回一個承諾的背景。 我想上面的代碼的輸出是:

Updated 
Updated 
Finished 
Done 

但我得到的輸出是:

Done 
Updated 
Updated 

所以,async.each的回調不工作和代碼不等待async.each完成。

+1

'async.js' * does not not with promise。不要使用它。 – Bergi

+0

爲什麼使用這些無操作功能? – naomik

+0

@Bergi除了async.js以外的任何建議? – Ashutosh

回答

-1

您必須從async.each操作中調用callback中的合格號。實際上,異步並不知道你的回調何時解析。

另外,DONE應始終是您看到的第一個文本,因爲async.each不會阻止。當你開始運行運行腳本,async.each將被註冊,但因爲你的代碼是異步的,將達到updateRecordupdateQuantities完整

async.each(bottles, function(bottle, callback) { 
    updateQuantity(bottle[constant.SUBSTANCE_ID], 0) 
     .then(function() { 
      ... 

      updateRecord(bottle) 
       .then(function() { 
        console.log('Updated'); 
        callback(); 
       }, 
       function() {}); 
     }, function() {}); 
}, function() { 
    console.log('Finished'); 
}); 
console.log('Done'); 
+0

非常感謝megawac,剛剛在文檔中確認了你的答案:) – Ashutosh

+1

這不會處理失敗。 – Bergi

+0

@Bergi不在問題範圍內... – megawac

0

不要使用async.js前console.log('Done')在所有的承諾,他們使用他們的內置方法能夠滿足您的需求,而且您不需要回調回調。

bottles.reduce(function(prev, bottle) { 
    return prev.then(function() { 
     // set substance quantity to 0 
     return updateQuantity(bottle[constant.SUBSTANCE_ID], 0) 
    }).then(function() { 
     bottle[constant.EXPIRY] = expiry; 
     bottle[constant.IS_AVAILABLE] = true; 
     return updateRecord(bottle); 
    }).then(function() { 
     console.log('Updated'); 
    }); 
}, Promise.resolve()).then(function() { 
    console.log('Finished successfully'); 
}, function(err) { 
    console.error(err) 
}).then(function() { 
    console.log('Done'); // notice you must put this in the callback 
}); 
console.log('Started');