JS同步未按顺序触发

Bee*_*gie 1 javascript json

我有一个JavaScript函数,无法按顺序触发。它先触发CheckForAddRecordsToAddFromDSS方法,然后触发if (check1 || check2)语句,甚至触发CheckForMissingRecordsFromSupp方法。

为什么会这样呢?

$.getJSON("/Home/CheckForMissingRecordsFromSupp", function (data) {
        check1 = data;
    }).done($.getJSON("/Home/CheckForAddRecordsToAddFromDSS", function (data) {
        check2 = data;
    }).done(function () {
    if (check1 || check2) {
                location.reload();
            }
    })
    );
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

为什么会这样呢?

.done期望传递一个函数。您传递的返回值$.getJSON不是函数。

考虑以下示例:

foo(bar())
Run Code Online (Sandbox Code Playgroud)

即使不知道任何有关foo或者bar,我们肯定知道,bar在执行之前 foobar的返回值传递给foo

您的代码应为:

$.getJSON("/Home/CheckForMissingRecordsFromSupp", function(data) {
  check1 = data;
}).done(function() { // <- function
  $.getJSON("/Home/CheckForAddRecordsToAddFromDSS", function(data) {
    check2 = data;
  }).done(function() {
    if (check1 || check2) {
      location.reload();
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

话虽如此,由于.done也收到了网络响应,因此您无需将回调传递给$.getJSON。您可以这样写:

$.getJSON("/Home/CheckForMissingRecordsFromSupp").done(function(check1) {
  $.getJSON("/Home/CheckForAddRecordsToAddFromDSS").done(function(check2) {
    if (check1 || check2) {
      location.reload();
    }
  });
});
Run Code Online (Sandbox Code Playgroud)