Как разрешить Обещание в функции цикла - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь выполнить несколько асинхронных запросов, а затем поместить полученные данные в массив с помощью цикла for.Однако я столкнулся с проблемой, что сам forloop не возвращает значение, которое требуется для разрешения обещания. Также я хотел бы использовать массив для рендеринга для метода GET.Итак, как мне выполнить обещание в цикле for и убедиться, что массив заполнен, прежде чем я отобразлю его для метода GET.Извините за мой плохой английский.Я все еще новичок в асинхронной концепции, пожалуйста, научите меня простыми словами, если это возможно.Кроме того, если есть какие-либо более эффективные способы решения проблемы, я хотел бы знать.

const currencyName = ["btc", "eth", "xrp"];
let dataCollections = [];
for (i = 0; i < currencyName.length; i ++) {
  dataCollections.push(new Promise(function(resolve, reject) {
    request.get(`https://apiv2.bitcoinaverage.com/indices/global/ticker/${currencyName[i]}jpy`, function(error, response, body) {
      if (error) {
        reject(error);
      } if (dataCollections.length === 3) {
        dataColletions = [];
      }  else {
        resolve(JSON.parse(body));
      }
    });
  }));
}

//Promise.all(??).then(??)

//For rendering dataCollections
  app.get("/", function(req, res) {
    res.render("home", {dataCollections: dataCollections});
}

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

1) рассмотрите возможность присвоения имени вашему массиву currencyNames во множественном числе, чтобы вы могли назвать свой итератор currencyName.

2) Ваш цикл for заново изобретает функцию array.map.Попробуйте вместо этого использовать array.map.

3) В цикле for есть предложение if (if (dataCollections.length === 3)), которое также означает, что предложение else неверно в операторе if.Я предполагаю, что это опечатка.

Теперь до сути вашего вопроса, да Proimse.all(Array<Promise>) - это то, что вы хотите;он разрешается, когда все элементы в его параметре разрешаются.

const currencyNames = ["btc", "eth", "xrp"];

let dataCollections = currencyNames.map(currencyName => new Promise((resolve, reject) =>
    request.get(`https://apiv2.bitcoinaverage.com/indices/global/ticker/${currencyName}jpy`, (error, response, body) => {
      if (error)
        reject(error);
      else
        resolve(JSON.parse(body));
    })));

//For rendering dataCollections
app.get("/", async (req, res) =>
    res.render("home", {dataCollections: await Promise.all(dataCollections)}));
0 голосов
/ 27 сентября 2019

Сделать конечную точку асинхронной:

 app.get("/", async function(req, res) {
   res.render("home", {dataCollections: await Promise.all(dataCollections) });
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...