我正在尝试执行异步循环,在其中执行某些操作并在结束后写入控制台。看起来像这样:
const http = require('http');
async function load(link)
{
try{
http.get(link, response => console.log(`File: ${link}`));
}catch(e){
console.log('error');
}
}
async function loop(arrayOfLinks)
{
for(let link of arrayOfLinks)
load(link);
}
module.exports = (arrayOfLinks) => {
(async () => {
await loop(arrayOfLinks);
console.log('Files: '+arrayOfLinks.length);
})();
}
但是,我有:
Files: 3
File: http://localhost:8000/1.jpg
File: http://localhost:8000/2.jpg
File: http://localhost:8000/3.jpg
我想要的是:
File: http://localhost:8000/1.jpg
File: http://localhost:8000/2.jpg
File: http://localhost:8000/3.jpg
Files: 3
问题:
- 为什么
await
运算符不阻止下一步? - 我该如何解决这个问题?
谢谢
最佳答案
您需要确保 load
函数返回 Promise。 http.get
本身不会返回它,因此您想包装它(或使用基于 promise 的 HTTP 库,如 fetch
等)。
简单的 promise 包装器可能如下所示:
async function load(link) {
try {
return new Promise((resolve, reject) => {
http.get(link, resolve).on('error', reject)
})
.then(response => console.log(`File: ${link}`))
} catch (e) {
console.log('error', e.message);
}
}
async function loop(arrayOfLinks) {
for (let link of arrayOfLinks)
await load(link);
}
你还需要在loop
中使用await load(link)
。
关于javascript - 在异步循环后写入控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47058176/