15

次のようなことをしたい:

delay( 2500 )
  .then( function () { console.log( "Step 1 done" ) } )
  .then( delay( 7500 ) )
  .then( function () { console.log( "Step 2 done" ) } );

したがって、遅延の実装は以前に何度も実証されています。

function delay( ms ) {
  var deferred = Q.defer();
  setTimeout( deferred.resolve, ms );
  return deferred.promise;
}

しかし、node.js で上記を実行すると、次のようになります。

... delay of 2500ms
Step 1 done
Step 2 done
... delay of ~7500ms

私が期待するものではなく:

... delay of 2500ms
Step 1 done
... delay of 7500ms
Step 2 done

https://github.com/kriskowal/q/wiki/Examples-Galleryで提供されている例では、promise 関数でチェーンされた同期関数 (コールバックを伴わずに値を返す関数) の例を見つけることができません。

同期アクションと非同期プロミスを混在させる方法はありますか?

私はもう試した:

function synchronousPromise() {
  var deferred = Q.defer();
  console.log( "Synchronous function call" );
  deferred.resolve();
  return deferred.promise;
}

delay( 2500 )
  .then( function(){synchronousPromise()} )
  .then( function(){delay( 7500 )} )
  .then( function(){synchronousPromise()} );

そして、これは以下を出力します:

... delay of 2500ms
Time now is 2013-06-20
Time now is 2013-06-20
... delay of 7500ms

.. まだ私が達成しようとしているものではありません。

4

3 に答える 3

13

コールバックを連鎖させたい場合は、コールバックの 1 つから新しい promise オブジェクトを返す必要があります。最初の例では、次のように書きます

.then( delay( 7500 ) )

これは、関数ではなく promise オブジェクトを に渡すことを意味します.thenPromise/A+ の提案(Q が従う) によると、関数以外の引数はすべて無視する必要があります。したがって、基本的には、次のように書くのと同じです。

delay( 2500 )
  .then( function () { console.log( "Step 1 done" ) } )
  .then( function () { console.log( "Step 2 done" ) } );

代わりにdelay、promise オブジェクトを呼び出して返す関数を渡します。

delay( 2500 )
  .then( function () { console.log( "Step 1 done" ); } ) 
  .then( function () { return delay( 7500 ); } )
  .then( function () { console.log( "Step 2 done" ); } );

これで、最後のコールバックは、2 番目のコールバックで返された promise オブジェクトが解決された後にのみ呼び出さdelayれます。

于 2013-06-20T12:48:23.363 に答える