直接调用回调或返回回调
Invoke a callback directly or return the callback
有时我看到return被用来调用回调,特别是当回调包含错误时。
假设我有这样的代码:
function one(cb) {
// Call some service and wait for the response, but let's take the following as an example
if (2+2 === 4) {
cb(null);
} else {
// this vs return cb(false);
cb(false);
}
console.log("test");
}
one(function(error) {
if (error)
console.log(error);
});
什么时候返回一个回调实际上是有意义和有用的?
这里有一种方法可以看出使用return和不使用return的区别:
var one = function(cb) {
// Call some service and wait for the
// response, but let's take the following as an example
if (2+2 === 4) {
cb(true);
}
if (2+3 !== 4){
cb(false);
}
console.log("test");
};
one(function(val) {
if (val === true){
setTimeout(function(){
console.log('true');
},
1000);
}
if (val === false){
console.log('false');
}
});
输出false
, test
,一秒后输出true
如果您将one
函数中的第一个条件更改为:
if (2+2 === 4) {
return cb(true);
}
你注意到了什么?
一秒钟的输出是什么,然后只有true
。为什么?因为在函数中使用return
表示您想要执行最终操作,然后跳出函数执行上下文。该函数中不再运行任何代码。
简短的回答是,它用于异步编程;当需要一些时间才能达到结果时,通常采用一种方法,在函数(最终)完成时通过回调使函数"回调"。这允许函数的调用者在等待返回值的同时继续执行操作。
因此,当函数执行的任务可能需要(相对)较长时间才能完成时,使用回调将"有意义且有用"。您很可能见过在发出AJAX请求时常用的回调。这里采用异步方法,允许调用者继续运行其他JavaScript以对触发它的事件作出反应。如果采用同步方法,您可能会看到页面/JavaScript在等待AJAX请求的响应时挂起。
回调对于为函数的多个结果定义处理程序也很有用。例如,jQuery允许用户指定在AJAX函数失败、成功或中止时执行的回调函数。
回答您关于使用return cb(ev)
或类似的问题:
也就是说,在异步工作流中也使用Return语句是至关重要的,以确保不会意外调用多个回调。
(from here)
虽然我可能很难想出一个例子,但由于这样或那样的原因,函数调用者可能希望有一个可以通过回调设置的"标志"。也许如果这个函数(使用return cb(ev)
的那个)返回到"辅助函数"的内部,这个return
可能会触发另一个过程,比如清理,在回调被触发后处理。
我不确定,但我认为回调函数不是您示例中行为的最佳模式。
对于这种行为,一个更好的模式是Promises。看一个很好的教程:http://www.html5rocks.com/en/tutorials/es6/promises/- 如何使for循环等待回调返回值
- node.js mongojs findOne回调返回错误为null
- 在回调返回错误中带有点的 JSONP
- 从嵌套在函数中的Node.js回调返回对象
- 回调返回响应,但当在API中发送时,响应在节点JS中显示为空白
- 挂起的回调:在每次回调返回之前返回响应
- 当查询返回对象时,Express Mongo回调返回undefined
- 而循环和回调返回不同的结果
- 从Meteor.method中的回调返回值
- jquery getjson 函数:回调返回错误的字符串
- 承诺回调返回承诺
- AJAX 回调返回 0
- 通过回调返回 AJAX
- Javascript 从多个回调返回值
- 从 JavaScript 回调返回一个值
- 从回调返回值
- grunt-从回调返回解析的数据
- Firebase-回调返回[object object]
- Javascript回调返回值
- 当一个promise的resolve回调返回另一个promise时,它是如何工作的