【问题标题】:pass variable to deferred JSON function?将变量传递给延迟的 JSON 函数?
【发布时间】:2013-08-22 00:18:06
【问题描述】:

如何在这个延迟函数中使用 myValue 以便定义 myQuery?

$.getJSON('lorem.json', function (data) {

    var myKey = $("input").val(); 
    var myValue = data[myKey];

}).then(function () {

    var myQuery = "http://example.com?q=" + myValue ;

    $.getJSON(myQuery, function (info) {
        console.log(info);
...

【问题讨论】:

  • 尝试将其全局化,而不是 var myValue = data[myKey]; 使用 window.myValue = data[myKey]; 然后将其与 myQuery 一起使用,例如 var myQuery = "http://example.com?q=" + window.myValue ;
  • 不能只用一个回调函数吗?为什么需要将函数一分为二?
  • @MaveRick 全局变量太过分了,只有在另一个脚本文件中的某个时间您想将相同的全局变量用于不同的目的时才会导致问题。您可以将myValue 移动到$.getJSON call 的包含范围,这样两个回调函数都可以访问它。如果包含的作用域不是全局作用域而是另一个函数作用域,它不会污染全局作用域,也不会引起命名冲突。无论哪种方式,似乎 OP 想要做一些更简单的事情,为此可能有一个更简单的解决方案。
  • 如何使变量myValue 可以被第二个函数读取而不使其成为全局变量?
  • @MattiasBuelens 所说的,我同意,没有理由推迟函数,成功时的常规回调函数足以处理 OP 在他的代码示例中所做的事情。

标签: jquery getjson jquery-deferred


【解决方案1】:

你可以使用父上下文

var myValue = null;
$.getJSON('lorem.json', function (data) {

    var myKey = $("input").val(); 
    myValue = data[myKey];

}).then(function () {

    var myQuery = "http://example.com?q=" + myValue ;

    $.getJSON(myQuery, function (info) {
        console.log(info);

【讨论】:

  • 制作全局变量不是好习惯。将它包装在一个函数中是可行的,但这种方法有一个缺点。例如,如果您正在创建一个实用程序函数,该函数返回一个从 data -> info 开始的 deferred,如果不使其全局可用,您将无法访问该变量。使用 deferred,您可以携带该信息,并轻松地将您在沿途步骤中获取的任何信息传递给回调。
  • 但是代码不会使 var 全局化,只创建一个带有父上下文的 var。每个函数都将创建一个自身上下文,以共享数据,只有在父上下文中才有可能。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2011-08-03
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多