了解回调和承诺。这个对吗?
Understanding callbacks and promises. Is this correct?
所以,我目前正在学习回调和承诺,并且在观看教程时总是被绊倒。所以我想我会把它放在一个例子中,看看是否有人能告诉我我的想法是否正确。我目前正在使用 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."
})
})
使用 promise 比回调有任何性能优势,反之亦然?
谢谢!
回调和承诺是不同的,但共享一些概念。
回调只是作为参数传递给另一个函数的函数,该函数可以随时执行。
例如:
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);
以上代码是回调函数的一个非常简单的实例 - 现在它可以按顺序执行(如上面的示例),也可以是事件循环上的异步操作。 (有关事件循环的更多信息:)
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 请求或 TCP 连接到数据库,比如 mongodb.
回到你原来的问题——你的假设是正确的,因为你的回调和承诺的演示是正确的,你的问题是关于性能的。
Javascript 是单线程的,所以如果你的回调函数被放置在事件循环中(它可能是也可能不是)那么它不会阻塞主执行调用堆栈。 Promises 本质上是异步操作,因此它们将始终放在事件循环中,因此性能因素取决于回调函数的底层实现 - Promises 将是异步的,因为一些常规回调可能是顺序的和同步的。
所以,我目前正在学习回调和承诺,并且在观看教程时总是被绊倒。所以我想我会把它放在一个例子中,看看是否有人能告诉我我的想法是否正确。我目前正在使用 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."
})
})
使用 promise 比回调有任何性能优势,反之亦然?
谢谢!
回调和承诺是不同的,但共享一些概念。 回调只是作为参数传递给另一个函数的函数,该函数可以随时执行。 例如:
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);
以上代码是回调函数的一个非常简单的实例 - 现在它可以按顺序执行(如上面的示例),也可以是事件循环上的异步操作。 (有关事件循环的更多信息:
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 请求或 TCP 连接到数据库,比如 mongodb.
回到你原来的问题——你的假设是正确的,因为你的回调和承诺的演示是正确的,你的问题是关于性能的。 Javascript 是单线程的,所以如果你的回调函数被放置在事件循环中(它可能是也可能不是)那么它不会阻塞主执行调用堆栈。 Promises 本质上是异步操作,因此它们将始终放在事件循环中,因此性能因素取决于回调函数的底层实现 - Promises 将是异步的,因为一些常规回调可能是顺序的和同步的。