非异步承诺回调
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
完成其异步工作后,按顺序调用 bar
和 bam
时,此代码是否会按预期工作?
是的,它将按预期工作。 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 可能是更好的选择。
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
完成其异步工作后,按顺序调用 bar
和 bam
时,此代码是否会按预期工作?
是的,它将按预期工作。 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 可能是更好的选择。