如何创建一系列未调用的promise函数

时间:2018-02-12 04:01:26

标签: javascript arrays promise

我的问题是我无法构建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在他的回答中使用的方法,所以我打算尝试一下。

2 个答案:

答案 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