在循环内使用Javascript Promise

时间:2019-03-19 13:49:22

标签: javascript node.js promise

我可以使用一些帮助来确定何时所有Javascript承诺都已解决。我正在遍历对象数组,对于每个对象,我都调用一个返回诺言的函数。每个承诺都分解为一个对象,我将这些对象合并在一起以创建一个大对象。当我知道这个大对象已经完成时,即当所有诺言都解决时,我想做些事情。我知道我应该能够使用Promise.all并传递我创建的诺言数组,但是我正在努力用代码来实现这一点。任何帮助您将不胜感激。这是我的代码:

let data = JSON.parse(body)
let compedObj = {}
for (let i=0;i<data.dock.length;i++) {
   getDockData(data.dock[i].url, user_token)
        .then (data => {
          compedObj = {...compedObj, ...data}
        })
}

function getDockData (url, token) {
  return new Promise((resolve, reject)=>{
    var options = {
        url: url,
        headers: {
          'authorization': `bearer ${token}`,
          'user-agent': /* my app details */
        }
    }

    function callback(error, response, body) {
      if (!error) {
        let data = JSON.parse(body)
        let obj = {}
        switch(data.title) {
          case "ToDos":
            obj = {todos: data.todos_count};
            break;
          case "Messages":
            obj = {messages: data.messages_count}
            break;
        }
        resolve(obj)
      } else {
        reject("there was an error")
      }
    }
      Request(options, callback);
      });
    }

1 个答案:

答案 0 :(得分:1)

首先,您可以将数据映射到Promise的映射中,然后在解决后将它们简化为一个对象:

Promise.all(data.dock.map(({url}) => getDockData(url, user_token)))
    .then(res => res.reduce((acc, curr) => ({...acc, ...curr}), {}))
    .then(compedObj => /* do something with the result data */);