在同一个函数中发送回调和响应

时间:2017-12-04 06:13:16

标签: javascript node.js

如果我在相同的函数(这里是A)中编写响应和回调,如果参数缺失(!a ||!b),是不好的做法,响应将被发送,但父上下文不会收到任何回调,结果,API将悬挂,内存将被浪费?

function practice (req, res){
    var a = req.body.a;
    var b = req.body.b;
    A(a,b, function(err, result){
        if(err){
            return err;
        }else{
            return res.send(c + "Action cmplete");
        }
    })
}

function A(a,b, callback){
  if(!a || !b){
      return res.send("param missing");
  }
  var c;
  c = a+b;
  return callback(null, c);
}

1 个答案:

答案 0 :(得分:0)

您的代码示例似乎有点不完整,因为您甚至无法在任何地方定义callbacka

但是,通常情况下,如果您正在设计一个执行某些异步操作并接受回调的函数,那么当异步操作完成并出现错误或成功完成时,您几乎总是希望为调用者提供反馈(并且可能具有返回值)。唯一的方法是在操作完成时始终调用回调。

如果你不这样做,那么调用者根本不会知道或有任何方式知道异步操作何时完成,而且通常(并非总是)是一个问题。因此,任何通过回调通知的通用异步API都应该在异步操作完成时始终调用回调。

从来电者的角度考虑一下。调用者需要知道在进行函数调用后要检查的内容。你想让自己的生活变得简单而一致。如果他们要检查所有内容,他们必须检查同步返回值,同步异常并检查是否调用了回调。这是一个需要所有这一切的API的噩梦。你真的想要一个只使用其中一种机制的API。因此,如果您有时会通过回调通知,那么您应该始终通过回调进行通知,而不要使用其他两种机制。

这是承诺管理异步操作的地方,因为它们可以更简单。只需总是从函数中返回一个promise,然后调用者就可以在promise上始终使用.then().catch()。然后,您的内部功能只能解决或拒绝该承诺。

另一方面,如果你想设计一个与调用者签订合同的函数,那么在这些条件下,我将执行其他一些代码,而不是调用回调,而在这些其他条件下,我是&#39 ;我将不执行其他代码并调用回调,你可以这样做。它不是一个非常一致的界面,对于不太熟悉你正在做的事情的来电者来说它不是很友好,但是你可以做到。

我很怀疑你是否因为不一致而在众所周知的API中看到这样的界面。但是,如果你真的想要的话,你可以自己动手做。我不认为这是最好的做法。