非异步承诺回调

Non-async promise callbacks

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 时,此代码是否会按预期工作?

是的,它将按预期工作。 q 通过将它们默默地包装在单子 API.

中按顺序处理非承诺的同步函数(正如预期的那样)

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

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 可能是更好的选择。