我如何定义一个异步调用的函数?
async function getPosts() {
for (i = 0; i < 1000000000; i++){}
console.log("loop done.");
}
console.log("start");
getPosts();
console.log("end");
结果是:
开始
循环完成。
结束
我期待:
开始
结束
循环完成
我希望如此,因为函数“ getPosts”被声明为“异步”。 所以我们不要等到功能完成。
我如何调整代码以获得预期的结果?
答案 0 :(得分:2)
异步函数可以是调用另一个函数返回一个Promise
的函数。在Promise
内,您可以放置setTimeout
而不是for循环,并最终通过asyncCall
进行调用:
function getPosts() {
return new Promise(resolve => {
setTimeout(() => {
resolve('done.');
}, 2000);
});
}
async function asyncCall() {
var result = await getPosts();
console.log(result);
}
console.log("start");
asyncCall();
console.log("end");
答案 1 :(得分:1)
您的代码不执行“异步”操作的主要原因是因为js线程的工作方式。 FOR循环将使用主线程来完成工作,代码将等待其完成循环。 @shys答案有效,但没有循环。 如果您希望工作正常,请查看WebWorker api
答案 2 :(得分:0)
总结毛里西奥·西普曼(Mauricio Sipmann)正确地说的话:异步函数是通过事件循环异步运行的函数(请参见async function
)。为了继续执行async function getPosts()
的调用上下文,i。 e。使用console.log("end")
,必须给事件循环一个暂停getPosts()
执行的机会,例如G。使用此功能的变体形式:
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }
async function getPosts() {
for (i = 0; i < 1000; i++) { await sleep(3) } // pause for 3 ms
console.log("loop done.");
}
console.log("start");
getPosts();
console.log("end");
但是fetch()-Method如何实现?
fetch()
可能包含这样的await
语句,以便事件循环可以在fetch()
等待HTTP响应时继续执行。