我的问题是我无法构建promisesArray。
这很好用,但我需要动态构建这个数组。
var promisesArray=[get(url1),get(url2),get(url3)]; // url1,url2,url3 are valid urls here
var promises = Promise.all(promisesArray);
promises.then(function(results) {
console.log('this came back: ',results);
}).catch(function(error) {
console.log(error);
});;
function get(url) {
// Return a new promise.
return new Promise(function(resolve, reject) {
// Do the usual XMLHttpRequest stuff
});
}
我正在尝试构建上面的数组promisesArray,其中每个元素都是一个promise,但我尝试的每一种方式我只是添加调用get()的结果 我最终得到了一系列未决的承诺
Array [ Promise { "pending" }, Promise { "pending" }, Promise { "pending" }]
我想要的时候:
promisesArray=[get(url1),get(url2),get(url3)];
例如,我尝试过:
let template=['a','b','c','d'];
var promiseArray=[]
template.forEach(function(pos){
let url=lookupUrl[pos]](); //just a function that returns a Url determined by the values of template array
promiseArray.push(get(url));
})
但显然我只是在这里返回get调用的结果..
我尝试使用bind,但我再一次得到了一系列执行promises ...
var promiseArray = template.map(function(pos){
var url = lookupUrl[pos]]();
var out= get.bind(null,url);
return out()
})
我不知道如何创建一系列未调用的函数。
[EDIT_UPDATE] 正如@JaromandaX在第一条评论中指出的那样,我已经拥有了我需要的东西,事实上,上述两种方法中的任何一种都可用于构建Promise数组。正如@ Roamer-1888也指出的那样,我一直认为我需要一系列未被调用的功能'这不是真的。
我喜欢@HMR在他的回答中使用的方法,所以我打算尝试一下。
答案 0 :(得分:0)
为什么不构建返回get-promise的函数数组,然后推迟执行,直到你进入promise.all
?
var promisesArray=[()=>get(url1),()=>get(url2),()=>get(url3)];
promise.all(promisesArray.map((x)=>x()))
这将同时启动您的所有get
次请求,all
的承诺无法解决,直到他们全部完成。
答案 1 :(得分:0)
我认为您正在寻找地图:
Promise.all(
urls.map(get)
)
如果你有一个模板数组,那么将它们映射到url,然后将url映射到promise:
const template=['a','b','c','d'];
Promise.all(
template.map(//map pos to url
pos=>lookupUrl[pos]()
).map(//map url to promise
get
)
);
如果您需要以某种方式限制它,请查看this answer。