【问题标题】:How exactly callbacks get their arguments?回调究竟是如何得到他们的论点的?
【发布时间】:2018-04-06 11:12:05
【问题描述】:

我很难理解 JavaScript 中的回调如何获取参数。或者换句话说:如何实现一个高阶函数,使其回调接受例如标准的errdata 参数。

就像回调示例中的in this article on asynchronous JavaScript以通常的方式使用(我知道这很常见,因为我在 Node.js moongose 中看到了这种模式(即for creating data in db)) :

function getData(options, callback) { 
    $.get("example.php", options, function(response) { 
        callback(null, JSON.parse(response)); 
    }, function() { 
        callback(new Error("AJAX request failed!")); 
    }); 
} 

// usage 
getData({name: "John"}, function(err, data) { 
    if(err) { 
        console.log("Error! " + err.toString()) 
    } else { 
        console.log(data); 
    } 
});

回调如何根据上面声明的getData() 函数获取参数errdata

【问题讨论】:

  • 回调究竟如何获取参数错误和数据?你给它,第 3 行和第 5 行
  • 当您调用getData 时,您将整个function(err, data) 函数作为第二个参数传递。如果您查看getData 函数,这就是所谓的callback,它仍然需要两个参数。如果您的响应成功,则函数的err 部分变为空,data 部分变为JSON.parse(response)
  • 但它究竟是如何变成 null 和 data 的呢?过去的时候什么都没有。 console.log(data) 如何传递 JSON.parse(response)?
  • 好的。抱歉@LinasMickevicius 太厚了。 3 号线和 5 号线。终于让我明白了。我想我的大脑更倾向于同步和命令式。我讨厌这个功能性的东西,里面的东西地狱里的东西。感谢您的耐心
  • 只是需要时间沉入,不知不觉中,会觉得完全正常和普通

标签: javascript asynchronous callback parameter-passing


【解决方案1】:

当函数被调用时,参数被传递给函数。

function foo(arg) {
    console.log(arg);
}

foo("This is the value");

当它是回调函数时仍然如此。

function foo(arg) {
    console.log(arg);
}

function bar(callback) {
    callback("This is the value");
}

bar(foo);

当回调函数被其他人编写的代码调用时,它仍然是正确的。存在于你没有检查源代码的库中。

【讨论】:

  • 我不是在问何时,而是如何。在您的示例中,您传递了一些完全任意的“foo”,但在猫鼬或文章的示例中,它以某种方式非常具体:第一个参数是错误,第二个参数是数据(即在数据库中创建的对象)。另一个示例可能是 Array.prototype.forEach 中的回调 - 它还接受 3 个非常具体的参数(currentValue、index、array)。我在问它是如何完成的。
  • 阅读答案中的最后一句话,它以完全相同的方式完成,但由库的实现者/幕后的特定功能完成。
  • 我太傻了。当调用该函数时,参数被传递给一个函数——所以当在 moongoose model.create() 中调用回调时,究竟传递了什么。调用的确切时间的错误和数据是什么?如果数据当时还没有提交,怎么可能是从数据库中检索到的对象?
  • 好的。我或多或少得到了它。 @LinasMickevicius,只是为了彻底解决问题-所以在引用的文章中,这个实现器将是 getData() 函数,它决定第 3 行和第 5 行的错误和数据,对吧?
  • 好的。现在它真的终于穿过了我(比我想象的要厚得多)的头骨。忘记回调是一个动态声明的函数是一件简单的事情 - 所以即使它看起来有点像你用 2 个参数(函数(错误,数据))调用的东西,此时没有任何调用,只是声明(和在第 3 行和第 5 行的 getData() 中调用)。经过 2 个月的连续 JS 编写 o_O 后,这是多么的回归!
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2017-01-17
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多