如果我在相同的函数(这里是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);
}
答案 0 :(得分:0)
您的代码示例似乎有点不完整,因为您甚至无法在任何地方定义callbacka
。
但是,通常情况下,如果您正在设计一个执行某些异步操作并接受回调的函数,那么当异步操作完成并出现错误或成功完成时,您几乎总是希望为调用者提供反馈(并且可能具有返回值)。唯一的方法是在操作完成时始终调用回调。
如果你不这样做,那么调用者根本不会知道或有任何方式知道异步操作何时完成,而且通常(并非总是)是一个问题。因此,任何通过回调通知的通用异步API都应该在异步操作完成时始终调用回调。
从来电者的角度考虑一下。调用者需要知道在进行函数调用后要检查的内容。你想让自己的生活变得简单而一致。如果他们要检查所有内容,他们必须检查同步返回值,同步异常并检查是否调用了回调。这是一个需要所有这一切的API的噩梦。你真的想要一个只使用其中一种机制的API。因此,如果您有时会通过回调通知,那么您应该始终通过回调进行通知,而不要使用其他两种机制。
这是承诺管理异步操作的地方,因为它们可以更简单。只需总是从函数中返回一个promise,然后调用者就可以在promise上始终使用.then()
和.catch()
。然后,您的内部功能只能解决或拒绝该承诺。
另一方面,如果你想设计一个与调用者签订合同的函数,那么在这些条件下,我将执行其他一些代码,而不是调用回调,而在这些其他条件下,我是&#39 ;我将不执行其他代码并调用回调,你可以这样做。它不是一个非常一致的界面,对于不太熟悉你正在做的事情的来电者来说它不是很友好,但是你可以做到。
我很怀疑你是否因为不一致而在众所周知的API中看到这样的界面。但是,如果你真的想要的话,你可以自己动手做。我不认为这是最好的做法。