直接调用回调或返回回调

Invoke a callback directly or return the callback

本文关键字:回调 返回 调用      更新时间:2023-09-26

有时我看到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/