私はAPI開発者であり、通常、ある非同期呼び出しからの結果を別の非同期呼び出しaska async waterfallに渡す必要があるエンドポイントを記述します。Promise waterfall
私は通常これに約束を使用して、以下の方法を実行します。
task1()
.then(result1){
task2(result1)
.then(result2){
task3(result2)
.then(result3){
// API response
})
.catch(function(err){
// Task 3 handle err
})
})
.catch(function(err){
// Task 2 handle err
})
})
.catch(function(err){
// Task 1 handle err
})
をそれはあまりありませんが、コールバックを使用して上で得られていることは明らかです。 "コールバック地獄"の代わりに、私は今 "約束地獄"を得ました。
私はnpm bluebirdを見ましたが、滝の約束はサポートされていないようです。
const tasks = [
job1: function(cb){
task1()
.then(function(result){
cb(null, result);
})
.catch(function(err){
cb(err);
})
},
job2: function(cb, result1){
task2(result1)
.then(function(result){
cb(null, result);
})
.catch(function(err){
cb(err);
})
},
job3: function(cb, result2){
task3(result2)
.then(function(result){
cb(null, result);
})
.catch(function(err){
cb(err);
})
}
]
async.series(tasks, function(err, results){
if(err){
// handle error
}
// API callback
});
しかし、これもかなり無駄です:
時々私は約束を返しasyncとラップタスクを使用します。 そして、あなたがPromise.all
について考えているのは、1つのタスクの結果が次のタスクに渡されないためです。
もっと良い方法はありますか?
(間違った約束を使用している)あなたは、ライブラリasync.js promisifiedがあることを知っている必要があります - 非同期-Q(https://www.npmjs.com/は、 package/async-q)は、約束事で直接動作するので、コールバックの折り返しなしに約束を返すことができます。 – slebetman