2017-01-14 9 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」*は約束どおりに動作しません。それを使用しないでください。 – Bergi

+0

なぜこれらのノーオペレーション機能を使用していますか? – naomik

+0

@Bergi async.js以外の提案はありますか? – Ashutosh

答えて

-1

async.each操作からcallbackに渡された通話を呼び出す必要があります。つまり、asyncでは、コールバックがいつ解決されるかはわかりません。

また、DONEは、最初に表示されるテキストで、async.eachはブロックされません。スクリプトを実行している実行を開始すると、async.eachが登録されますが、あなたのコードが非同期であるため、それはupdateRecordconsole.log('Done')に達し、updateQuantities完全

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を使用しないでください。彼らの組み込みメソッドで必要なものが可能で、コールバックに戻す必要はありません。

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'); 
関連する問題