2

私はプロミス、つまりwhen.jsを試していて、いくつかのテストコードを変換したいのですが、ドキュメントを読んだ後でもそれを行う方法が少し不明です。これまでの私の実験は、標準的なコールバック ピラミッドよりもはるかに複雑だったので、近道が欠けていると思います。

複製したいサンプルコードは次のとおりです。

Async1(function(err, res) {
  res++;
  Async2(res, function(error, result) {
    done();
  })
})
4

2 に答える 2

3
nodefn.call(Async2, nodefn.call(Async1)).ensure(done);

ここでは、Async2実際に同期的に呼び出され、引数として Promise を使用します -解決するAsync1()のを待ちません。Async1それらをチェーンするには、使用する必要があります

nodefn.call(Async1).then(nodefn.lift(Async2)).ensure(done);
// which is equivalent to:
nodefn.call(Async1).then(function(result) {
    return nodefn.call(Async2, result);
}).ensure(done);

2 つの呼び出しの間にいくつかのロジックを実行したい

次に、別の関数をチェーンに入れるか、チェーン内の関数の 1 つを変更する必要があります。

nodefn.call(Async1)
  .then(function(res){return res+1;}) // return modified result
  .then(nodefn.lift(Async2))
  .ensure(done);
// or just
nodefn.call(Async1).then(function(res) {
    res++; // do whatever you want
    return nodefn.call(Async2, res);
}).ensure(done);
于 2013-07-03T21:02:57.127 に答える
1

Whenについてはわかりませんが、Deferredライブラリを使用すると、次のようになります。

// One time configuration of promise versions
async1 = promisify(async1);
async2 = promisify(async2);

// construct flow
async1().then(function (res) { return async2(++res); }).done();
于 2013-07-04T07:59:33.790 に答える