在回调函数中获取变量值

时间:2018-05-22 14:53:38

标签: javascript jquery ajax

我有一个回调函数

function QueryKeyword(keyword, site, callback) {
  var querykeyword = keyword;
  var website = site;

  $.ajax({
    url: "http://www.test.com",
    jsonp: "jsonp",
    dataType: "jsonp",
    data: {
      Query: querykeyword
    },
    success: callback
  });
}

我用这样的for循环调用这个函数:

for (i = 0; i < questionTerm.length; i++) {
  for (j = 0; j < site.length; j++) {
    var searchTerm = questionTerm[i] + ' ' + $('#search').val();

    QueryKeyword(searchTerm, site[j], function(reslt) {
      // I need to get j variable value here
      console.log(j);
    });

  }

}

现在我需要得到&#34; j&#34;函数中的变量值参见我控制j变量值,但它没有得到j变量值。

请您告诉我如何获取此值。

提前致谢

2 个答案:

答案 0 :(得分:4)

问题是,在你的回调时,j被多次重新分配给不同的东西。

您可以选择几种方法。

  1. 使用您需要的参数调用您的回调
  2. function QueryKeyword(keyword, site, index, callback) {
      // ...
      $.ajax(
          success: function(result) {
              // call the callback with a second param (the index j)
              callback(result, index);  
          }
      )
    }
    
    QueryKeyword(searchTerm, site[j], j, function(reslt, param) {
       // param is j
       console.log(result, param);
    });

    1. 将var保存在闭包中
    2. (function() {
          var value = j;
          ...
      })();

      1. 使用forEach
      2. questionTerm.forEach((term, i) => {
            site.forEach((s, j) => {
                // we are in a closure, 
                // j will be correct here.
                QueryKeyword(term, s, function(reslt) {
                  // j is still correct here
                  console.log(j);
                });
            })
        });

        1. 如果您使用es6,则可以使用let关键字。 Here是一个很好的解释,它在使用for循环时是如何工作的
        2. for(let i = 0; i < 10; i++) {
           console.log(i);
           setTimeout(function() {
             console.log('The number is ' + i);
           },1000);
          }

答案 1 :(得分:0)

你必须单独传递它:

<强>定义

QueryKeyword(searchTerm, site[j], j, function(reslt) {
   // I need to get j variable value here
   console.log(j);
});

<强>执行

@@trancount