簡體   English   中英

Promise如何使代碼異步?

[英]How does promise make code asynchronous?

我知道我們所有人都使用promise來避免函數回調地獄,但是我的問題是promise代碼在事件循環中的何處運行以及該代碼是否真正異步。

我的意思是,此代碼是否僅因為在諾言中運行而異步? 還是諾言不是事件循環的一部分?

 const p = new Promise((resolve,reject) =>{ resolve('am i part of the event loop ? , am ia diffrent thread ? or am i synchronized? ') }) 

Promise如何使代碼異步?

沒有。

許諾提供了用於處理異步函數的標准接口(例如, .then()方法)。

如果在Promise中完成的所有操作都是非異步的,則代碼仍然是非異步的。

 const p = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); }); console.log(3); 

您可以在上面看到Promise正在阻塞,就像其他任何非異步代碼一樣。

在javascript中,我們無法創建同步函數。 設置了預定義的異步函數,我們可以使用它們使代碼異步。 這些異步函數通常以回調函數為參數來在異步任務完成時執行任務。

承諾是同步的, .then()是異步函數。 在async-await中, await是異步的,並且在await之后寫入的任何內容都會在async-wait之后執行。

function main(){
  console.log(2);
  return new Promise( (re,rj) => {
    console.log(3);
    re(4);
    console.log(5);
    rj(6);
    console.log(7);
  });

}

console.log(1);

main()
.then( r=> {
  console.log(r)
})
.catch(e=>{
  console.log(e)
});

console.log(8);

如預期的輸出是

1
2
3
5
7
8
// asynchronous .then function
4

當我們使用setTimeout,setInterval,API調用,fs函數時,會發生類似的事情,所有異步事件都發生在瀏覽器/內核中,然后所有回調都發生在我們的Javascript單線程中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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