在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。
答案 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