有时我看到返回被用来调用回调,特别是如果回调包含错误。
假设我的代码如下:
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);
});
何时返回回调实际上有意义并且有用?
答案 0 :(得分:1)
简短的回答是它用于异步编程;当我花费一些时间来达到这个结果时,通常采取一种方法来使功能“回叫”#34;通过回调(最终)完成。这允许所讨论的函数的调用者在等待返回值的同时继续执行操作。
因此,使用回调将有意义并且有用"当函数执行的任务可能需要(相对)长的时间才能完成。在制作AJAX请求时,您可能已经看到了常用的回调。这里采用异步方法允许调用者继续运行其他JavaScript以响应触发它的任何事件。如果采用同步方法,您可能会在等待AJAX请求的响应时看到页面/ JavaScript挂起。
回调对于为函数的多个结果定义处理程序也很有用。例如,jQuery允许用户指定在AJAX函数失败,成功或中止时要执行的各个回调。
回答有关使用return cb(ev)
或类似内容的问题:
也就是说,在异步工作流中也使用Return语句是至关重要的,以确保不会意外调用多个回调。
(取自here)
虽然我可能很难想出一个例子,但由于某种原因,函数调用者可能需要一个"标记"可以通过回调设置的提升。也许如果此函数(使用return cb(ev)
的函数)返回到"帮助函数"的 internals ,则此return
可能会触发另一个过程例如清理,在触发回调之后处理。
答案 1 :(得分:1)
这里可以看出使用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
表示您要执行该最终操作,然后跳出函数执行上下文。该函数不再运行其他代码。
答案 2 :(得分:-2)
我不确定,但我认为回调函数不是样本中行为的最佳模式。
这种行为的更好模式是Promises。查看好的教程:http://www.html5rocks.com/en/tutorials/es6/promises/