[英]How does async-await works in Javascript?
使函數異步是否使其異步?
我開始使用async-await代替Promise鏈。 我做了類似的事情
async function f(){
let r = await first();
let d = await sec(r);
return d;
}
調用此函數后,我可以看到所有代碼都是異步發生的。 但是在一些較老的文章中,我讀到我們無法在javascript中創建異步函數。 使函數異步也會使其異步。
使函數異步是否使其異步?
不,它使它返回一個promise,並將暫停該功能,直到promise到達await
語句時,promise解析。
承諾了一種管理異步代碼的方法,但不要停止同步,阻止代碼被同步或阻止。
使函數異步是否使其異步?
不,不是。
是的,我們無法在javascript中創建異步函數。 我們可以在執行異步任務后使用異步函數執行代碼,但是代碼只能在我們的單線程中執行。
async在async- await
是異步的,當編譯器到達await時,它將停止執行並將所有內容推送到事件隊列中,並在async函數之后繼續執行同步代碼。 例
function first() {
return new Promise( resolve => {
console.log(2);
resolve(3);
console.log(4);
});
}
async function f(){
console.log(1);
let r = await first();
console.log(r);
}
console.log('a');
f();
console.log('b');
由於等待是異步的,因此等待之前的所有其他事情都照常發生
a
1
2
4
b
// asynchronous happens
3
使函數異步是否使其異步?
取決於異步的含義。
讓我們考慮一下您的代碼的稍有不同的版本:
async function f(){
let rPromise = first();
let dPromise = sec(r);
let r = await rPromise;
let dPromise = await dPromise;
return d;
}
在這里,因為我們要等到第二個承諾開始后才await
第一個承諾,所以這兩個都可能同時等待(如果first()
足夠快地返回完成的承諾,它們可能不會同時等待)。 兩者可能同時做事。 rPromise
可能在dPromise
之前完成,也可能在dPromise
之后完成。 但是,只有當他們正在做的事情(例如等待來自Web服務的I / O響應)發生在javascript本身之外時,他們才會同時在做事情。
在某些其他語言/框架中,我們可能期望兩個線程在這里運行,可能在不同的內核上。 在javascript中,只有一個線程,而實際上在javascript中運行的代碼只有一點(而不是javascript正在等待響應的Web訪問庫,觸發延遲的計時器等),在first()
或sec()
運行,但不能同時在兩者中運行。 如果一個在內部await
返回,而另一個正在處理await
東西,那么在另一個函數完成之前,不會進行進一步的處理。
這是asynchronous
(兩者不是按固定的順序發生的,其中一個必須先發生在另一順序之前)。
它不是多線程的,並且每個線程中的實際javascript代碼不會同時發生,在其他情況下,這也稱為asychronous
。
但是在一些較老的文章中,我讀到我們無法在javascript中創建異步函數。
好吧,首先,直到最近,我們甚至直到最近都無法在javascript中創建這種異步代碼,盡管我們可以通過其他方式創建promise。
其次,雖然它是異步的,但不是來自其他語言和框架的人會認為它是異步的,異步性主要是通過多線程實現的,而多線程既具有javascript所缺乏的功能,也具有它所缺乏的陷阱。
Async和Await只是編寫JavaScript Promises的一種簡單方法。 但是,在幕后,JavaScript會將代碼轉換為執行引入Async和Await之前的代碼。
在后台,您的代碼示例:
async function f(){
let r = await first();
let d = await sec(r);
return d;
}
真正成為以下代碼:
function f() {
return first().then(r => sec(r));
}
或更詳細的示例:
function f() {
return new Promise(
(resolve, reject) => {
first().then(
function(r) {
return sec(r);
}
).then(
function(d) {
resolve(d);
}
).catch(ex) {
reject(ex);
}
}
);
}
如您所見,您的代碼示例更容易閱讀。 但這可能會造成混淆,因為它看起來是同步的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.