javascript

时间:2018-01-05 21:14:29

标签: javascript callback

我一直在阅读JavaScript中的异步函数,发现我并不完全理解来自here的以下代码。

这是:

doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log('Got the final result: ' + finalResult);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

我不明白的是所有这些结果来自何处。

3 个答案:

答案 0 :(得分:3)

它们是回调。回调只是一个函数,它作为参数传递给另一个函数,并用于处理接收回调的函数完成的某些操作的结果作为一个论点。你可以自己写。一个简单的例子:

function callMe(callback) {
	let addition = 2 + 2;
	callback(addition);
}

callMe(function(result) {
	console.log(result);
});

callMe调用其回调函数,结果为2 + 2.然后在使用callMe时在回调函数中收到该结果,然后您可以编写自己的自定义代码来执行任何操作你想要它。

答案 1 :(得分:0)

Javascript是一种单线程语言,当异步代码块以非阻塞方式结束时,回调用作控制执行流的方法。回调通常只是另一个函数(函数B),它被传递到异步函数(函数A)以在函数A完成时运行。即

doSomething(callback) {
    //fetch or ajax or whatever to server store response.
    //pass response BACK to callback function
    callback(response)
}

你还没有发布这些功能的内部块,但我认为我们都可以安全地假设"结果"是服务器的响应传递回回调函数I.E

error: incompatible types for redefinition of 'applyChange'

答案 2 :(得分:0)

JavaScript的美妙之处在于,您已经拥有测试它所需的一切。

您发布的代码引用了4个函数(不要忘记故障回调):

doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log('Got the final result: ' + finalResult);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

不写这些功能。所以让我们写下来:



var failureCallback = function() {
  console.log('something went wrong');
}

var doSomething = function(callback) {
  window.setTimeout(function() {
    var result = Date.now(); // Create some data that will change every time the function is invoked
    callback(result);
  }, 500);
}

var doSomethingElse = function(res, callback) {
  window.setTimeout(function() {
    var result = [res]; // all this function really does is put the first argument in an array
    callback(result);
  }, 500);
}

function doThirdThing(res, callback) {
  window.setTimeout(function() {
    res.push(Math.PI); // res is supposed to be an array, so we can add stuff to it.
    var result = res;
    callback(result); // here we could have used res as a value, but I kept it consistent
  }, 500);
}

doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log('Got the final result: ', finalResult); // switched to a comma to display properly in the console
    }, failureCallback);
  }, failureCallback);
}, failureCallback);




为了创造一些异步性,我使用了setTimeout,所以你必须等待1.5秒。

使用回调函数作为参数的3个函数,只需执行它们给出的函数即可。这在JavaScript中是绝对标准的,其中函数是第一类对象:您可以将它们作为参数传递,就像任何其他值类型一样。