亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

了解回調和承諾。這個對嗎?

了解回調和承諾。這個對嗎?

慕田峪9158850 2022-12-29 15:44:47
因此,我目前正在學習回調和承諾,并且在觀看教程時總是被絆倒。所以我想我會把它放在一個例子中,看看是否有人能告訴我我的想法是否正確。我目前正在使用 MongoDB 和 Mongoose。這是從教程中獲取的一段示例代碼。我相信這被認為是回調?  user.save((err) => {    if (err) {      return res.status(400).json({        error: "You are not authorized to perform this action.",      })    });然后這會被認為是一個承諾?user.save().catch(err => {   return res.status(400).json({      error: "You are not authorized."   })})使用承諾比回調有任何性能優勢,反之亦然?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

回調和承諾是不同的,但共享一些概念?;卣{只是作為參數傳遞給另一個函數的函數,該函數可以隨時執行。例如:


function iNeedACallback(callback)

{

  // execute a bunch of code...

  

  // use the callback function provided 

  callBack("a function called 'iNeedACallback'")

}

const callback = (fromFunction) => console.log("I am a callback function called from: " + fromFunction);


// Execute iNeedACallback by passing in the callback

iNeedACallback(callback);

上面的代碼是一個非常簡單的回調函數實例 - 現在它可以按順序執行(如上面的示例),也可以是事件循環上的異步操作。(有關事件循環的更多信息:Why do you need to await AJAX calls in JS but not in C#?)


Promise 使用回調函數以常規方式處理異步代碼。Promise 的性質推斷它的一些代碼將在異步執行時放置在事件循環中,并且在等待網絡調用等操作時不會阻塞任何其他代碼。例如:


const promise = new Promise((resolve, reject) => {

 setTimeout(() => {

    const text = "i was only called after 2 seconds :(";

    resolve(text);

    }, 2000)

})


promise.then((text) => console.log(text))

console.log("i got called immediately :)")


//Output:

//i got called immediately :)

//i was only called after 2 seconds :(

在上面的示例中,我們提供了一個回調函數,當異步操作完成時(如 setTimeout)執行,其中最常見的用例是網絡調用,如 HTTP 請求或與數據庫(如 mongodb)的 TCP 連接。


回到你原來的問題——你的假設是正確的,因為你的回調和承諾的演示是正確的,你的問題是關于性能的。Javascript 是單線程的,所以如果你的回調函數放在事件循環上(它可能或者可能不是)那么它不會阻塞主執行調用堆棧。Promises 本質上是異步操作,因此它們將始終放置在事件循環中,因此性能因素取決于回調函數的底層實現 - Promises 將是異步的,因為一些常規回調可能是順序的和同步的。


查看完整回答
反對 回復 2022-12-29
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號