非异步承诺回调

Non-async promise callbacks

本文关键字:回调 承诺 异步      更新时间:2023-09-26
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);

nonPromisifiedApi完成其异步工作后,此代码是否按预期的顺序调用barbam ?

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

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>

再一次,当你阅读这篇关于承诺的文章时,你不会浪费你的时间。

我认为使用ES6 Promise填充而不是Q可能是一个更好的选择。

是的,它将按预期工作。q通过将它们静默地包装在一元API中,按顺序处理未承诺的同步函数(正如预期的那样)。