$ .each使用Ajax和Variable Modification

时间:2015-12-01 00:00:27

标签: javascript jquery ajax closures

为什么whereString返回"其中"而不是"其中" +一些数据。我知道这有封闭和范围,但我不知道如何解决它。

提前感谢您的帮助。

以下是代码:

    function SomeFunction() {
        var whereString = "where ";
        var seperator = " ";

        $.when.apply($(".SomeClass").each(function () {

             var promise = SomeAjaxCall().done(function (data) {
                whereString += seperator + data.d

             });
             seperator = "and "

       }).then(function() { 

         alert("Finished");
         alert(whereString); // Alerts "where " and not "Where "+data.d

      })
   };

2 个答案:

答案 0 :(得分:0)

这是因为警报是在你的每个人之后发出的。已经在jquery select的所有结果上调用了函数。但是,SomeAjaxCall()是异步的,因此,'已完成'函数的召唤是因为ajax调用是在每个'每个'之前完成的。功能完成执行,因此警报触发。

虽然最终可能不是您想要的,但您可以在发出警报之前添加几秒钟的超时时间,以便查看'其中'最终会更新。

答案 1 :(得分:0)

注意,.apply()期望将this上下文设置为第一个参数,将数组设置为第二个参数; .each()未返回数组,.each()似乎在问题)处缺少右括号js

尝试将.map()替换为.each().get()链接到.map()以返回jQuery保证对象数组,设置contextthis $.when.apply$。另外,在return promise中包含.map()以将jQuery promise对象返回到.then()

function SomeFunction() {
  var whereString = "where ";
  var seperator = " ";
  // set `this` to `jQuery` alias `$`
  $.when.apply($, $(".SomeClass").map(function(i, el) {
    // do ajax stuff
    var promise = SomeAjaxCall().done(function (data) {
                    whereString += seperator + data.d
                  });
    seperator = "and ";
    // return jQuery promise object
    return promise
  // include closing parenthesis to `.map()` , use `.get()` to return
  // array of jQuery promise objects
  }).get()).then(function() {

    alert("Finished");
    alert(whereString); 

  })
};

function SomeFunction() {
  var whereString = "where";
  var seperator = " ";
  // set `this` to `jQuery` alias `$`
  $.when.apply($, $(".SomeClass").map(function(i, el) {
    // do asynchronous stuff
    var promise = $.Deferred().resolve({
      "d": el.textContent
    }).done(function(data) {
      whereString += seperator + data.d

    });
    seperator = " and ";
    // return jQuery promise
    return promise
  // include closing parenthesis to `.map()` , use `.get()` to return
  // array of jQuery promise objects
  }).get()).then(function() {

    console.log("Finished");
    console.log(whereString); 

  })
};

SomeFunction()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="SomeClass">abc</div>
<div class="SomeClass">def</div>