2016-11-10 13 views
1

私は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つのタスクの結果が次のタスクに渡されないためです。

もっと良い方法はありますか?

+0

(間違った約束を使用している)あなたは、ライブラリasync.js promisifiedがあることを知っている必要があります - 非同期-Q(https://www.npmjs.com/は、 package/async-q)は、約束事で直接動作するので、コールバックの折り返しなしに約束を返すことができます。 – slebetman

答えて

6

あなたは確かに反パターンが起こっています。あなたは、あなたがしたように約束を入れ子にすることを避けるために、約束から約束を返すことができます。

promiseOne() 
    .then(() => promiseTwo()) 
    .then(() => promiseThree()) 
    .then(() => promiseFour()); 

ところで、Nodeは組み込みのPromiseコンストラクタをサポートしています。別にrealseanpの答えから

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

const promise = new Promise((resolve, reject) => { 
    // do something and then resolve 
    resolve(); 
}) 
promise().then(() => { ... }); 
+0

清算してくれてありがとうございますが、あなたの解決策は、ある非同期呼び出しの結果を別の非同期呼び出しに渡すためのものではありません。 – ChrisRich

+1

FYIあなたは 'promiseOne()。then(()=> promiseTwo())と言うことができます。次に(()=> promiseThree())。 – Marty

+0

Doh ...あなたは絶対正しいです:私は間違った約束をしています。それが働いた:-) – ChrisRich