Несколько разрешений асинхронных вызовов с использованием Promises - PullRequest
0 голосов
/ 26 июня 2018

В Node.js у меня есть разрешение Promise.all (массив) с результирующим значением, которое мне нужно объединить с результатами другого вызова асинхронной функции. У меня возникают проблемы с получением результатов этой второй функции, поскольку она разрешается позже, чем promise.all. Я мог бы добавить его в Promise.all, но это разрушило бы мой алгоритм. Есть ли способ получить эти значения за пределами их разрешений, чтобы я мог изменять их статически? Могу ли я создать контейнер, который ждет их результатов?

Если быть более точным, я читаю из базы данных Firebase в реальном времени, которая опрашивает данные API. Мне нужно запустить алгоритм на этих данных и сохранить его в архиве MongoDB. Но архив открывается асинхронно, и я не могу открыть его до разрешения моих результатов (которые нужно записать).

Пример:

module.exports = {
news: async function getNews() {
    try {
        const response = await axios.get('https://cryptopanic.com/api/posts/?auth_token=518dacbc2f54788fcbd9e182521851725a09b4fa&public=true');
        //console.log(response.data.results);
        var news = [];
        response.data.results.forEach((results) => {
            news.push(results.title);
            news.push(results.published_at);
            news.push(results.url);
        });
        console.log(news);
        return news;
    } catch (error) {
        console.error(error);
    }
},
coins: async function resolution() {
    await Promise.all(firebasePromise).then((values) => {
       //code
       return value
 }
}

Я пробовал первое решение, и оно работает для первой записи, но, возможно, я неправильно пишу свою асинхронную функцию во втором экспорте, потому что она возвращает неопределенное значение.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете вернуть обещание от getNews

   module.exports = {
     news: function getNews() {
         return axios.get('https://cryptopanic.com/api/posts/?auth_token=518dacbc2f54788fcbd9e182521851725a09b4fa&public=true')
         .then(res => {
         // Do your stuff
         return res;
       })
     }
   }

, а затем

 let promiseSlowest = news();

 let promiseOther1 = willResolveSoon1();
 let promiseOther2 = willResolveSoon2();
 let promiseOther3 = willResolveSoon3();

 Promise.all([ promiseOther1, promiseOther2, promiseOther3 ]).then([data1, 
 data2, data3] => {
    promiseSlowest.then(lastData => {
       // data1, data2, data3, lastData all will be defined here
    })
 })

Преимущество здесь в том, что все обещания будут запускаться и выполняться одновременно, поэтому общее время ожидания будет равно времени, затраченному promiseSlowest.

Проверьте ссылку для более: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Examples

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...