使用node.js在每个循环中使用deferred promise

use*_*203 2 node.js promise cheerio

当我在node.js的循环中使用promise时,我遇到了一个问题.下面是一个简单的例子,我使用cheerio来抓取一个网页并执行以下操作:

$('.xyz').each(function(){
  fn1()
  .then(fn2)
  .then(fn3)    
});


function fn1() {
  var deferred = Q.defer();
  console.log("1");
  deferred.resolve();
  return deferred.promise;
}

function fn2() {
  var deferred = Q.defer();
  console.log("2");
  deferred.resolve();
  return deferred.promise;
}

function fn3() {
  var deferred = Q.defer();
  console.log("3");
  deferred.resolve();
  return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

我期待最终输出为123123123,但我得到111222333.有人可以解释为什么会发生这种情况.我对node.js很新,可以使用一些帮助.

ale*_*ods 5

这是因为Q调度"然后"回调到下一个滴答(在承诺解决之后).见."下一步嘀"又通过实现setImmediatesetTimeoutprocess.nextTick等等,具体取决于所使用的平台(见).所有promises实现都保证then在当前调用堆栈执行后将执行回调.它可以通过向微任务队列(如v8引擎)或事件循环任务队列(setTimeout例如使用)添加回调来实现.如果您不了解事件循环任务队列的工作原理 - 请参阅此视频