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
完成异步工作后,此代码是否按预期工作,bam
和nonPromisifiedApi
按顺序调用?
答案 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,同步函数(可能是预期的)。