我的问题是我无法构造承诺。
这可以很好地工作,但我需要即时构造此数组。
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
});
}
我正在尝试构建上面的数组承诺,每个元素都是诺言,但是我尝试的各种方式我只添加了调用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));
})
,但显然我只返回呼叫的结果。
我尝试使用绑定,但我再次获得了一系列执行承诺...
var promiseArray = template.map(function(pos){
var url = lookupUrl[pos]]();
var out= get.bind(null,url);
return out()
})
我不知道如何创建一系列未称为功能。
[edit_update]正如@JaromAndax在第一个评论中指出的那样,我已经拥有了我需要的东西,实际上,以上两种方法都可以构建一系列承诺。正如 @roamer-1888还指出的那样,我被跟踪到以为我需要一系列"无符合功能",这是不正确的。
我喜欢@HMR在他的答案中使用的方法,所以我要尝试一下。
我想您正在寻找地图:
Promise.all(
urls.map(get)
)
如果您有一个模板数组,则将其映射到URL,然后将其映射到url:
:const template=['a','b','c','d'];
Promise.all(
template.map(//map pos to url
pos=>lookupUrl[pos]()
).map(//map url to promise
get
)
);
如果您需要以某种方式油门,请查看此答案。
为什么不构建返回get-promise然后推迟执行的功能数组,直到您进入promise.all
?
var promisesArray=[()=>get(url1),()=>get(url2),()=>get(url3)];
promise.all(promisesArray.map((x)=>x()))
这将同时启动您的所有get
请求,并且all
的承诺在完成之前才能解决。