gpt4 book ai didi

node.js - 为什么 Node 更喜欢错误优先回调?

转载 作者:IT老高 更新时间:2023-10-28 23:19:01 27 4
gpt4 key购买 nike

Node 程序员通常使用这样的范例:

let callback = function(err, data) {
if (err) { /* do something if there was an error */ }

/* other logic here */
};

为什么不简化函数,只接受一个参数,要么是错误,要么是响应?

let callback = function(data) {
if (isError(data)) { /* do something if there was an error */ }

/* other logic here */
};

看起来更简单。我能看到的唯一缺点是函数不能将错误作为它们的实际预期返回值返回 - 但我相信这是一个非常微不足道的用例。

为什么错误优先模式被认为是标准的?

编辑:isError 的实现:

let isError = obj => obj != null && obj instanceof Error;

另一个编辑:我的替代方法是否可能比 Node 约定更方便,因为只接受一个参数的回调更有可能被非回调用例重用?

最佳答案

(有关使用问题中的回调约定的 npm 模块,请参阅下面的“更新”。)

这只是一个约定。 Node 也可以使用您建议的约定 - 除了您无法将错误对象作为您注意到的成功的预期值返回,这可能是也可能不是问题,具体取决于您的特定要求.

当前 Node 约定的问题是,有时回调可能不期望任何数据,而 err 是它们采用的唯一参数,有时函数期望成功时有多个值 -例如看

request(url, (err, res, data) => {
if (err) {
// you have error
} else {
// you have both res and data
}
});

this answer有关上述代码的完整示例。

但是即使在采用多个参数的函数中,您也可以将第一个参数设置为错误,即使那样我也看不到您的样式有任何问题。

错误优先的 Node 样式回调是 Ryan Dahl 最初使用的,现在它非常普遍,并且适用于任何接受回调的异步函数。并不是说这个约定比你建议的更好或更糟,而是拥有一个约定——不管它是什么——使得回调和回调函数的组合成为可能,以及像 async 这样的模块依靠它。

事实上,我看到您的想法优于经典 Node 约定的一种方式 - 不可能在定义错误和第一个非错误参数的情况下调用回调,这对于 Node 样式回调是可能的,有时可以发生。不过,这两种约定都可能会调用两次回调 - 这是一个问题。

但是在 JavaScript 中还有另一个广泛使用的约定,特别是在 Node 中,它不可能同时定义错误和数据,而且不可能两次调用回调 - 不是接受回调,而是返回一个 promise ,而不是在 if 中显式检查错误值,就像在 Node 样式回调或您的样式回调中一样,您可以单独添加仅获取相关数据的成功和失败回调。

所有这些样式在它们可以做的事情上都差不多:

nodeStyle(params, function (err, data) {
if (err) {
// error
} else {
// success
}
};

yourStyle(params, function (data) {
if (isError(data)) {
// error
} else {
// success
}
};

promiseStyle(params)
.then(function (data) {
// success
})
.catch(function (err) {
// error
});

Promise 可能会更方便地满足您的需求,并且它们已经得到广泛支持,并且有很多工具可以使用它们,例如 Bluebird和其他人。

你可以看到一些其他的答案,我解释了回调和 promise 之间的区别以及如何更详细地一起使用,这在这种情况下可能对你有所帮助:

当然,我看不出为什么你不能编写一个模块来将 Node 风格的回调转换为你的风格回调,反之亦然,promise 也是如此,就像 promisifyasCallback在 bluebird 工作。如果使用您的回调样式对您来说更方便的话,这似乎是可行的。

更新

我刚刚在 npm 上发布了一个模块,您可以使用它来设置您喜欢的回调样式:

您可以安装它并在您的项目中使用:

npm install errc --save

它允许你有这样的代码:

var errc = require('errc');
var fs = require('fs');

var isError = function(obj) {
try { return obj instanceof Error; } catch(e) {}
return false;
};

var callback = function(data) {
if (isError(data)) {
console.log('Error:', data.message);
} else {
console.log('Success:', data);
}
};

fs.readFile('example.txt', errc(callback));

更多示例见:

我编写了这个模块作为如何操作函数和回调以满足您的需求的示例,但我在 MIT 许可下发布它并发布在 npm 上,因此您可以根据需要在实际项目中使用它。

这展示了 Node 的灵 active 、它的回调模型以及编写高阶函数以创建适合您需求的自己的 API 的可能性。我发布它是希望它可以作为理解 Node 回调样式的示例。

关于node.js - 为什么 Node 更喜欢错误优先回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com