【发布时间】:2020-01-02 06:40:29
【问题描述】:
我需要在 nodejs 中编写一些云函数。这个特定的 Cloud Function 需要遍历 URL 数组并对第三方 API 进行一些异步调用。
这是一些模拟我正在尝试做的占位符代码,改编自here:
function checkPhotos(photos) {
var checkedPhotos = [];
var promiseArray = photos.map(asyncFunction);
Promise.all(promiseArray).then(results => {
console.log('results are: ', results)
results.forEach(result => { checkedPhotos.push(result) });
})
// I want to block here until the Promise.all call above completes
// but it does not block, it returns [] immediately while the async
// calls run
return checkedPhotos;
}
// This is a pretend async function to simulate the third party API
function asyncFunction(photo) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("in async function, photo is " + photo)
resolve(photo)
}, Math.random()*2000)
})
}
然后我调用函数:
var photos = ['https://example.com/example.jpg', 'https://example.com/example2.jpg'];
var checkedPhotos = checkPhotos(photos);
我希望checkedPhotos 包含来自results 的值,但起初它是一个空数组,然后异步调用完成并填充数组。如何使 checkPhotos() 阻塞,直到所有异步调用都完成,以便我可以将 checkedPhotos 作为完全填充的数组返回?
【问题讨论】:
-
您不会在 Javascript 中“阻止”。您将需要结果的代码放在异步回调中。这就是数据可用的地方。有了 Promise,你还可以使用
async和await来编写看起来更同步的代码,尽管它仍然不是真正的阻塞。 -
这就是你正确使用 Promise 的方式 - pastebin.com/rNQrS1x5
-
关于 javascript 中的任何异步,您需要了解的主要内容是……您不能“短路”代码以提供同步结果……对于承诺,您必须使用 @987654331 @ 获取结果...或使用 async/await 语法
标签: javascript node.js asynchronous