如何创建一系列未符合的承诺功能



我的问题是我无法构造承诺。

这可以很好地工作,但我需要即时构造此数组。

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的承诺在完成之前才能解决。

最新更新