扩展ES6 Promise以将回调转换为延迟模式

时间:2015-09-24 01:18:11

标签: javascript promise ecmascript-6 es6-promise

我想知道您对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(){
});

哪个需要回调。

你怎么看?

2 个答案:

答案 0 :(得分:4)

也没有正确/经常使用承诺。使用承诺的通常方式是:

ajax.get('/get').then(function(){
  return ajax.get('/cart');
}).then(function(){
    alert('all done!');
});

Promises链,您可以从then处理程序返回一个promise,它将导致then返回的promise等待其完成并假定其状态。

当然,除非承诺取决于您可以(并且可能应该)同时执行它们:

Promise.all([ajax.get("/get"), ajax.get("/cart")]).then(function(results){
   // both done here, concurrently
});

避免使用explicit construction anti-pattern,无需创建延迟。 API看起来与您描述的方式不同的原因是,如果您throw同步,它将转换为拒绝,您不必同时添加.catch和{{1你的代码处理程序很容易出错。

答案 1 :(得分:1)

这只是对ES6标准的模糊处理,而且我没有看到你添加的好处。它只是一层抽象,并不是真正需要的。

我建议采用一种与ES6承诺相得益彰的不同方法......

以下是正确的,但无关紧要(见评论) 任何"然后"可以使用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];
       });