了解异步与同步JavaScript

时间:2018-06-20 19:36:28

标签: javascript asynchronous

我了解同步被阻止,一次只能运行一件事,等等

和异步可以让其他事物同时运行

我仍然感到有些困惑。如果有人使用promise或async / await进行回调或api请求,那么代码仍然必须等待其返回,然后我才能对其进行任何处理?努力看待差异如何同步

在此异步代码中:

async componentDidMount() {
  const response = await axios.get('https://reqres.in/api/users?page=2')
  console.log(response);
}

我仍然必须等待第二行(常量响应)完成才能记录它或终止该功能。与同步有何不同?

2 个答案:

答案 0 :(得分:2)

  

我了解同步被阻止,一次只能运行一件事,等等

一般来说就是JavaScript。

  

和异步可以让其他事物同时运行

可以在等待非JavaScript内容(例如到达HTTP响应)的同时搁置异步代码,而不是同时运行其他JavaScript代码。

  

我仍然必须等待第二行(常量响应)完成才能记录它或终止该功能。与同步有何不同?

在调用componentDidMount之前,您正在内部 console.log中等待HTTP响应,其他代码外部 componentDidMount可以继续运行

async function doAsync() {
    const x = await waitForIt();
    console.log("This is x", x);
}

function waitForIt() {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve("one second later");
        }, 1000);
    });
}

console.log("Before doAsync");
doAsync();
console.log("After doAsync");

答案 1 :(得分:1)

Javascript基于一种所谓的...,这意味着任务的执行将永远不会停止。就像其他答案中提到的那样,JS通常是同步的。

用JS处理代码很容易:处理所有可以处理的东西而无需等待时间;当您遇到异步任务或通常需要等待的内容(例如:Never Blocking Event Model)时,它将被推送到setTimeout(function, timeout)上。举例来说,Queue of messages请求已完成。消息被推送到队列,但是JS继续执行下面的代码。但是,由于JS是单线程的,谁来处理http请求?它由基础引擎处理。由于此任务在JS外部,因此不在其范围内,并且无法知道何时完成。为此,基础引擎一旦完成任务,它将执行回调函数以通知任务已完成。

这大致就是您的示例中发生的情况。