Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 接受回调最佳实践的函数设计_Javascript_Node.js - Fatal编程技术网

Javascript 接受回调最佳实践的函数设计

Javascript 接受回调最佳实践的函数设计,javascript,node.js,Javascript,Node.js,我正在为一个API设计一个模块,在其中的一些方法中,只有在您关心结果的情况下,才有必要指定回调。例如,请求存储一些数据,其中响应是关于存储的数据的信息(内部id、时间戳等)。我理解函数的代码应该是: MyFunc.prototype.putRecord = function(data, next){ var self = this; //Any validation and transformation api.storeRecord(data, function(err

我正在为一个API设计一个模块,在其中的一些方法中,只有在您关心结果的情况下,才有必要指定回调。例如,请求存储一些数据,其中响应是关于存储的数据的信息(内部id、时间戳等)。我理解函数的代码应该是:

MyFunc.prototype.putRecord = function(data, next){
    var self = this;
    //Any validation and transformation
    api.storeRecord(data, function(err, data){
        next(err, data);
    });
};
我的问题是如何设计它,以便在
next==“undefined”
时,我的模块不会抛出错误。如果
api.storeRecord
调用返回错误,我仍然希望在未提供
next
参数的情况下抛出错误。 我正在考虑创建一个helper函数,用于检查是否定义了
next
,如果定义了,则调用它,或者在出现错误时抛出错误:

function callNext(err, res, next){
    if (next) next(err, data);
    else if (err) throw err;
};
然后我可以调用此函数,而不是
next

MyFunc.prototype.putRecord = function(data, next){
    var self = this;
    //Any validation and transformation
    api.storeRecord(data, function(err, data){
        callNext(err, data, next);
    });
};

这是我想做的事情的最佳方式,还是有其他被视为标准的方式

你可以把它弄干净一点。由于处理程序只转发调用,因此实际上可以完全消除它。您确实需要处理无效/丢失的
next
,以便像您那样抛出正确的
err
。下面是我如何使用回调方案实现的:

function throwHandler(err) {
  if(err) {
    throw err;
  }
}

function nextOrHandler(next) {
    if('function' === typeof next) {
      return next;
    }
    return throwHandler;
};

MyFunc.prototype.putRecord = function(data, next) {
    api.storeRecord(data, nextOrHandler(next));
}

完全不同的解决方案是回报承诺,而不是接受承诺callback@Bergi谢谢你指出承诺。我不知道这些,它们真的很有用。