使用Promises的多种异步呼叫解决方案

时间:2018-06-26 11:39:21

标签: javascript asynchronous es6-promise

在Node.js中,我有一个Promise.all(array)分辨率,其结果值需要与另一个异步函数调用的结果结合在一起。我在获取第二个函数的结果时遇到了问题,因为它比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
 }
}

我尝试了第一个解决方案,并且它适用于第一个条目,但是我可能在第二次导出时写错了异步函数,因为它返回的是undefined。

1 个答案:

答案 0 :(得分:0)

您可以从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