非异步承诺回调
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
?
下面是一个片段,向您展示了它的良好工作(使用我建议您的语法)。
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中,按顺序处理未承诺的同步函数(正如预期的那样)。
相关文章:
- 承诺在非节点式回调上使用Bluebird
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- JQuery 承诺已经包含回调的函数
- JavaScript - 返回承诺和/或调用回调
- 承诺中的成功回调不会发生$http
- 如何重构“;回调金字塔”;转换为基于承诺的版本
- 承诺在Protractor中进行回调排序
- Javascript承诺动态回调
- 编写一个使用传递两个参数的回调的承诺
- Phantom.js-如何使用承诺而不是回调
- 在第一次错误回调时退出承诺链
- 如何获取 Ember 组件对象内部承诺成功或错误回调
- 创建承诺回调
- 回调/承诺无法正常工作
- 通知承诺角度删除回调
- 回调/承诺在快递.js中实现
- Node sequelize回调承诺期望一个函数,是否有一种方法可以通过函数调用删除已声明的函数
- Angular-For Loop HTTP回调/承诺
- 特定于Node-webkit的javascript回调/承诺问题
- 让javascript函数与回调/承诺实现总是返回一个承诺