为了账号安全,请及时绑定邮箱和手机立即绑定

了解回调和承诺。这个对吗?

了解回调和承诺。这个对吗?

慕田峪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 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号