Работа с обещаниями Javascript внутри цикла - PullRequest
0 голосов
/ 19 марта 2019

Я мог бы использовать некоторую помощь, чтобы определить, когда все обещания 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 Ответ

1 голос
/ 19 марта 2019

Сначала вы можете отобразить данные в карту обещаний, а затем, после разрешения, превратить их в объект:

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 */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...