我已經更改了以下注釋的答案。既然,你提到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