簡體   English   中英

async-await如何在Javascript中工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM