如何定义异步功能?

时间:2019-07-18 12:48:11

标签: javascript runtime

我如何定义一个异步调用的函数?

async function getPosts() {
    for (i = 0; i < 1000000000; i++){}
    console.log("loop done.");
}

console.log("start");
getPosts();
console.log("end");

结果是
开始
循环完成。
结束


期待
开始
结束
循环完成

我希望如此,因为函数“ getPosts”被声明为“异步”。 所以我们不要等到功能完成。

我如何调整代码以获得预期的结果?

3 个答案:

答案 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响应时继续执行。