【问题标题】:Building an array of promises for Promise.all() on the fly即时为 Promise.all() 构建一系列承诺
【发布时间】:2018-01-05 19:09:01
【问题描述】:

所以我一直在尝试使用 Promise.all() 方法,但遇到了一个问题,我需要向该方法传递一组承诺,但我不确定要调用多少承诺应用程序需要/需要。

这是我通过专门构建数组得到的一种方法

router.post('/test1', (req, res, next) => {
    console.log('Hit on POST /test1');
    let arr = ['email1@email.com','email2@email.com'];
    Promise.all([
      lookUpUserId(arr[0]),
      lookUpUserId(arr[1])
    ]).then((x)=>{res.send(x)});
});

我的lookUpUserId() 函数正在返回一个承诺,如果我在数组中明确列出它们,我就可以使用它。但是,我尝试了几种动态创建此数组的方法,但似乎无法使其正常工作。
示例 #1

router.post('/test1', (req,res,next) => {
    console.log('Hit on POST /test1');
    let arr = ['email1@email.com','email2@email.com'];
    Promise.all((arr)=>{
      let out = [];
      for(let i=0; i<arr.length; i++){
        out.push(lookUpUserId(arr[i]));
      }
      return out;
    }).then((x)=>{res.send(x)});
});

示例 2

outer.post('/test1', (req,res,next) => {
    console.log('Hit on POST /test1');
    let arr = ['email1@email.com','email2@email.com'];
    let promArr = (arr)=>{
      let out = [];
      for(let i=0; i<arr.length; i++){
        out.push(lookUpUserId(arr[i]));
      }
    }
    Promise.all(promArr).then((x)=>{res.send(x)});
});

【问题讨论】:

  • 你创建了一个返回数组的函数,而不是一个数组。
  • 我在这里清理了一大堆加热的 cmets。不要继续发布它们。

标签: javascript node.js express promise


【解决方案1】:

您可以使用Array.prototype.map(),其中lookUpUserId 函数的第一个参数应该是arr 的一个元素

router.post('/test1', (req, res, next) => {
    console.log('Hit on POST /test1');
    let arr = ['email1@email.com','email2@email.com'];
    Promise.all(arr.map(lookUpUserId))
    .then(x => res.send(x));
});

第二种方法的问题是您不调用函数,将数组作为参数传递给函数,或者从函数返回out 数组

outer.post('/test1', (req,res,next) => {
    console.log('Hit on POST /test1');
    let arr = ['email1@email.com','email2@email.com'];
    let promArr = arr => {
      let out = [];
      for(let i=0; i<arr.length; i++) {
        out.push(lookUpUserId(arr[i]));
      }
      return out // `return` the array of `Promise` objects
    }
    Promise.all(promArr(arr)).then(x => res.send(x));
});

【讨论】:

    【解决方案2】:

    在这两种情况下都是同样的问题....您实际上并没有调用函数调用,因此您永远不会将数组传递给 Promise.all。

    使用第二个示例,纯粹是因为它更容易演示修复,尝试:

    Promise.all(promAll(arr))
        .then(...)
        .catch(...)
    

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2014-11-11
      • 2017-05-17
      • 2016-11-25
      相关资源
      最近更新 更多