为Promise.all()动态构建一个承诺数组

时间:2017-07-29 23:47:57

标签: javascript node.js express promise

所以我一直在尝试使用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)});
});

2 个答案:

答案 0 :(得分:0)

您可以使用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));
});

答案 1 :(得分:0)

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

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

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