直接调用回调或返回回调

时间:2014-06-16 23:53:32

标签: javascript

有时我看到返回被用来调用回调,特别是如果回调包含错误。

假设我的代码如下:

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);
});

何时返回回调实际上有意义并且有用?

3 个答案:

答案 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/