扩展ES6承诺,将回调转换为Deferred模式

Extend ES6 Promise to convert callback to Deferred pattern

本文关键字:转换 Deferred 模式 回调 ES6 承诺 扩展      更新时间:2023-09-26

我想知道您对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,它将被转换为拒绝,你不必在你的代码中添加.catchcatch (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];
       });