我已经更改了以下注释的答案。既然,你提到ES6承诺我会坚持。我们可能关心的回调有两种基本类型。
- DOM负载或其他一次性事件回调(在window.onload等)
- 异步方法回调(AJAX调用,setTimout等)
由于,
1 .DOM加载或其他一次性事件
var p = new Promise(function(res, rej) {
window.onload = res();
};
2.Plain回调:这些回调是不合作的符合惯例。例如的setTimeout
var p = new Promise(function(res, rej){
setTimeout(function() {
//your business/view logic
success? res():rej(); //if successful resolve else reject
}, 2000);
});
在每种上述情况下的承诺(VAR P)可以缠绕到由函数返回。
var myAsyncMethod = function() {
var p = new ... // as mentioned in 1 or 2
return p;
}
然后使用:
myAsyncMethod()
.then(function(){/* success-handler */})
.catch(function(/* failure-handler */));
具体到你的问题,你可能有很多这样的方法:
function baseAJAXCall (url) {
new Promise(functoin(rej, res) {
$.get(url, function(err, data){
if(err) {
rej();
}
else {
resolve(data);
}
});
}
};
function callAPIEndpoint(url) {
return baseAJAXCall(url);
}
function finalPromiseHandler() {
//your final business/view logic
}
//USAGE
callAPIEndpoint('/my-first-call')
.then(function(data){
var promiseArray = data.map(function(item){
return baseAJAXCall(item.url);
});
return Promise.all(promiseArray);
})
.then(finalPromiseHandler)
.catch(function(){
console.log('.error-message.');
});
编号:
How do I convert an existing callback API to promises?。从下面的评论
http://www.datchley.name/es6-promises/
链接。
--- OLD答:请忽略---
我熟悉这个库:https://github.com/kriskowal/q。而且,您可以使用q.all
和q.allSettled
结构来完成此操作。可能是你正在寻找的。
通常情况下,模式是创建一个返回承诺的函数。
function someAsyncFuncName1(url) {
var def = q.defer();
//async function
$.get(url, function(err, data){ //suppose
if(err){
def.reject();
}
else {
def.resolve(data); //pass the data to the .then() handler.
}
});
return def.promise;
}
function someAsyncFuncName2() {
var def = q.defer();
//async function
setTimeout(function(){ //suppose
//do something
if(good) {
def.resolve();
} else {
def.reject();
}
}, 1000); //arbitrary timeout of 1 second
return def.promise;
}
用法:
q.all([someAsyncFuncName1('/api-1'), someAsyncFuncName2()])
.then(function() {
//final handler
});
在思想的类似的线,如果你想等待所有承诺返回一个可以使用q.allSettled()
。
希望这会有所帮助。
--- EOF OLD答案---
在任何情况下,每一个“呼叫API端点”应该返回承诺本身,'promiseA'不应该使用['Promise' constructor antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-要避免的 - 它)。 – Bergi
目前还不清楚你的代码应该做什么。我们不能只给你一个通用的函数promiseA(){return Promise.all(establishEndpointsArr()。map(callEndpoint)); }' – Bergi