扩展ES6承诺,将回调转换为Deferred模式
Extend ES6 Promise to convert callback to Deferred pattern
我想知道您对ES6 Promise的这种扩展有什么看法(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise):
Promise.create = function() {
var deferred;
var promise = new Promise(function (resolve, reject) {
deferred = {
resolve: resolve,
reject: reject
};
});
promise.deferred = deferred;
return promise;
}
就像它避免使用第一个回调来获得更干净的代码:
var requestsdeferred = Promise.create();
obj.myFunctionWithCallback(function(){
obj.mySecondFunctionWithCallback(function(){
requestsdeferred.resolve('all done!');
});
});
requestsdeferred.then(function(result) {
});
代替:
var p = new Promise(function(resolve, reject){
obj.myFunctionWithCallback(function(){
obj.mySecondFunctionWithCallback(function(){
resolve('all done!');
});
});
});
p.then(function(){
});
需要回调。
你觉得怎么样?
这两种用法都不是promise的正确用法。通常使用promise的方式是:
ajax.get('/get').then(function(){
return ajax.get('/cart');
}).then(function(){
alert('all done!');
});
承诺链,你可以从then
处理器返回一个承诺,它会导致从then
返回的承诺等待它的完成并进入它的状态。
当然,除非承诺依赖,否则你可以(而且很可能应该)并发地执行它们:
Promise.all([ajax.get("/get"), ajax.get("/cart")]).then(function(results){
// both done here, concurrently
});
避免显式构造反模式,不需要创建延迟。API看起来不像你描述的那样的原因是,如果你同步throw
,它将被转换为拒绝,你不必在你的代码中添加.catch
和catch (e){
处理程序,这是容易出错的。
这只是对ES6标准的混淆,我看不出你的添加有什么好处。它只是一个抽象层,并不是真正需要的。
我建议用一种不同的方法来处理ES6的承诺…
以下是正确的,但不相关(见注释): 任何"thenable"都可以变成Promise.resolve
的标准承诺,所以如果你的ajax
(例如)是用jQuery的$.ajax
创建的,你可能:
var prom1 = Promise.resolve(ajax.get('/get'));
var prom2 = Promise.resolve(ajax.get('/cart'));
我们可以一起创建这些(以便请求并发运行),然后等待所有的承诺用Promise.all
完成:
Promise.all([req1, req2])
.then(function(vals){
//and get the results in the callback
var getData = vals[0];
var cartData = vals[1];
});
相关文章:
- 如何在JavaScript中将字符串转换为函数引用
- 如何在Javascript中将JSon对象转换为数组
- 使用JS将数组转换为json对象
- 如何使用json将对象列表从java转换为javascript
- 偶尔结结巴巴地说“;堆叠的”;translate()上的转换(v4.0.0-alpha40)
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 在Javascript中转换对象数组
- 将数字转换为一定数量的硬币
- 将纯文本URL转换为可单击链接
- 当图像转换为本地存储的DataURL时,EXIF被删除
- 如何使用js将SNAPSHOT内部版本号转换为3位数的整数
- 如何将TypeScript对象转换为普通对象
- 检测个位数整数时正在转换毫秒
- 从javascript到jquery的转换
- DOM事件通过JSON转换为java
- 将圆柱体转换为弯管
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- JavaScript代码问题:我正在将对象转换为数组
- 如何将字母转换为二进制代码
- 扩展ES6承诺,将回调转换为Deferred模式