1 回答

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 將是異步的,因為一些常規回調可能是順序的和同步的。
添加回答
舉報