栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么节点更喜欢错误优先回调?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么节点更喜欢错误优先回调?

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

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

当前Node约定的问题是,有时回调可能不期望任何数据,并且回调

err
是它们采用的唯一参数,有时函数在成功时期望多个值-例如,参见

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

但是,即使在使用多个参数的函数中,您也可能使第一个参数成为错误,即使那样,您的样式也不会出现任何问题。

错误优先的Node风格的回调是RyanDahl最初使用的,现在已经很普遍了,并且对于使用回调的任何异步函数都是期望的。并不是说这个约定比您建议的更好或更糟,而是 有了 一个约定-
无论它是什么-
使得回调函数和采用回调函数的组合成为可能,并且异步等模块都依赖于此。

实际上,我看到了您的想法优于经典Node约定的一种方式-
不可能同时调用带有错误和定义的第一个非错误参数的回调,这对于Node样式的回调是可能的,并且有时会发生。两种约定都可能使回调函数被调用两次-这是一个问题。

但是一般而言,尤其是在Node中,Javascript中还有另一种广泛使用的约定,即不可能同时定义错误和数据,而且不可能两次调用回调-
而不是进行回调,而是返回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和其他工具已经为许多使用它们的工具提供了广泛的支持。

当然,我没有理由不解释为什么您不能编写一个将Node样式的回调转换为样式的回调,反之亦然的模块,并且与promise一样,就像promisify和asCallback在Bluebird中一样。如果使用回调样式对您来说更方便,那似乎确实可行。

更新资料

我刚刚在npm上发布了一个模块,您可以使用该模块来获得自己喜欢的回调样式:

  • https://www.npmjs.com/package/errc

您可以通过以下方式安装它并在您的项目中使用:

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));

有关更多示例,请参见:

  • https://github.com/rsp/node-errc-example

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

这证明了Node的灵活性,其回调模型以及编写更高阶函数来创建自己的适合您的API的可能性。我发布它是希望它可以作为理解Node回调样式的示例。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号