我可以在JavaScript Q库中做出同步的承诺吗?

我想做以下事情:

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

..仍然不是我想要实现的.

如果你想链接回调,你必须从一个回调返回一个新的承诺对象.在你的第一个例子中,你写

.then( delay( 7500 ) )

这意味着你正在传递承诺对象,而不是功能.根据Promise/A+ proposal(其中Q),所有非函数参数都必须被忽略.所以,基本上就像你写的一样:

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

相反,pass函数调用delay并返回promise对象:

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

现在最后的回调只有在第二个回调延迟返回的承诺对象得到解决后才会被调用.

翻译自:https://stackoverflow.com/questions/17213297/can-i-make-a-synchronous-promise-in-the-javascript-q-library

转载注明原文:我可以在JavaScript Q库中做出同步的承诺吗?