非异步承诺回调

时间:2015-09-11 09:59:57

标签: javascript promise q

function foo(options) {
  var deferred = q.defer();
  nonPromisifiedApi(options, deferred.resolve, deferred.reject);
  return deferred.promise;
}

function bar() {}

function bam() {}

foo({})
  .then(bar)
  .then(bam);

bar完成异步工作后,此代码是否按预期工作,bamnonPromisifiedApi按顺序调用?

2 个答案:

答案 0 :(得分:3)

这是一个片段,向您展示它运作良好(使用我建议您的语法)。

function log(msg){ document.body.innerHTML += "<p>" + msg + "</p>"; }

function nonPromisifiedApi(options, fail, callback){
  log("nonPromisifiedApi");
  setTimeout(function(){
    callback("nonProm's async result");
  }, options.time);
}

function async(options){
  return Q.Promise(function(resolve, reject){
    nonPromisifiedApi(options, reject, function(val){
      log("async (val: " + val + ")");
      resolve("async's result");
    });
  });
}

function sync1(val){
  log("sync1 (val: " + val + ")");
  // filters the returned value
  return "sync1's result";
}

function sync2(val){
  log("sync2 (val: " + val + ")");
  // no return => undefined
}

async({time: 1000})
  .then(sync1)
  .then(sync2)
  .then(function(val){
     log("end (val: " + val + ")")
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.4.1/q.min.js"></script>

再次,您在阅读this article about promises时不会浪费时间。

我认为使用ES6 Promise polyfill而不是Q可能是更好的选择。

答案 1 :(得分:0)

是的,它会按预期工作。 q通过静默地将它们包装在monadic API中来按顺序处理非promisified,同步函数(可能是预期的)。