我想知道您对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(){
});
哪个需要回调。
你怎么看?答案 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];
});