我了解同步被阻止,一次只能运行一件事,等等
和异步可以让其他事物同时运行
我仍然感到有些困惑。如果有人使用promise或async / await进行回调或api请求,那么代码仍然必须等待其返回,然后我才能对其进行任何处理?努力看待差异如何同步在此异步代码中:
async componentDidMount() {
const response = await axios.get('https://reqres.in/api/users?page=2')
console.log(response);
}
我仍然必须等待第二行(常量响应)完成才能记录它或终止该功能。与同步有何不同?
答案 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外部,因此不在其范围内,并且无法知道何时完成。为此,基础引擎一旦完成任务,它将执行回调函数以通知任务已完成。
这大致就是您的示例中发生的情况。