【问题标题】:How to create an array of uncalled promise functions如何创建一组未调用的 Promise 函数
【发布时间】:2018-02-13 14:04:33
【问题描述】:

我的问题是我无法构造 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,其中每个元素都是一个承诺,但我尝试的每一种方式都只是添加调用 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,但我又一次得到了一组正在执行的 Promise...

 var promiseArray = template.map(function(pos){
   var url = lookupUrl[pos]]();
   var out= get.bind(null,url);
   return out()
 })

我不知道如何创建一个未调用函数的数组。

[编辑更新] 正如@JaromandaX 在第一条评论中指出的那样,我已经拥有了我需要的东西,实际上上述两种方法中的任何一种都可以用于构建承诺数组。正如@Roamer-1888 也指出的那样,我被认为需要一组“未调用函数”,这是不正确的。

我喜欢@HMR 在他的回答中使用的方法,所以我要试试。

【问题讨论】:

  • 那么,你想要一个承诺数组,而不是一个承诺数组?
  • get 何时/如何启动?我的意思是,你可以做function get(url) { return function() { // Return a new promise. return new Promise(function(resolve, reject) { // Do the usual XMLHttpRequest stuff }); }; } ...然后你有一个函数数组,但是它们将如何被调用?
  • 对不起,我不明白你的问题。我需要数组,就像第一部分有效的代码一样,我在程序中输入了 promise 数组。我无法以编程方式构建它。
  • 那么,你希望你的数组是一个 Promise 数组吗?
  • Promise.all 不调用函数,它等待 Promise 解决

标签: javascript arrays promise


【解决方案1】:

我想你正在寻找地图:

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

【讨论】:

    【解决方案2】:

    为什么不构建返回 get-promise 的函数数组,然后推迟执行,直到进入 promise.all 内部?

    var promisesArray=[()=>get(url1),()=>get(url2),()=>get(url3)];
    
    promise.all(promisesArray.map((x)=>x()))
    

    这将同时启动您的所有get 请求,并且all 的承诺在它们全部完成之前不会解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2019-10-10
      • 2013-04-30
      • 2012-02-20
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多