jQuery $ .when()。done()是否等待所有$ .ajax()。done()完成吗?

时间:2018-08-23 20:59:29

标签: javascript jquery

我对诺言很陌生,并且正在尝试确保我采用正确的方法。我的问题是,在将$.when$.ajax的调用列表一起使用时,.done中的$.when是否等待执行,直到所有.done所有$.ajax通话都结束了吗?也许这段代码片段可以帮助解释这个问题:

var apiSoftFail = false;

var myCallback = function(jsonData) {
  // lets say the json data returned by the ajax call contains a boolean
  // indicator of whether or not the purpose for doing the api call was successful
  if (jsonData.success) { 
    // do things with the jsonData returned
  } else {
    apiSoftFail = true; 
  }
};

var apiRequest = function(endpoint,callback) {
  return $.ajax(
    {'url':endpoint,'contentType': 'application/json'}
  ).done(function(data) {
    callback(data)
  });
};

$.when(
  apiRequest("/apiEndpoint1",myCallback),
  apiRequest("/apiEndpoint2",myCallback),
  apiRequest("/apiEndpoint3",myCallback)
).done(function() {
  if (apiSoftFail) {
    // "API Soft Fail"
    doThisFailureFunction();
  } else {
    doThisSuccessFunction();
  }
}).fail(function() {
  // "API Hard Fail"
  doThisFailureFunction();
});

在此先感谢您提供的任何见解或建议,以寻求更好的方法。

1 个答案:

答案 0 :(得分:-1)

是的,您的代码有一些问题。特别是,您需要给done一个函数。

.done(function() {
  if (apiSoftFail) {
    // "API Soft Fail"
    doThisFailureFunction();
  } else {
    doThisSuccessFunction();
  }
}

您可以在此处检查:api调用都将首先调用它们自己的回调并输出其结果,然后在其后打印“成功”。

如果您多次运行此代码段,则会看到各个请求未按定义的顺序运行(某些请求有时会先于其他请求完成),但“成功”打印将始终排在最后。

var apiSoftFail = false;

var myCallback = function(jsonData) {
  // lets say the json data returned by the ajax call contains a boolean
  // indicator of whether or not the purpose for doing the api call was successful
  if (jsonData) {
    console.log(jsonData);
    // do things with the jsonData returned
  } else {
    apiSoftFail = true; 
  }
};

var doThisFailureFunction = function() {

}

var doThisSuccessFunction = function() {
  console.log("success");
}

var apiRequest = function(endpoint,callback) {
  return $.ajax(
    {url:endpoint,'contentType': 'application/json'}
  ).done(function(data) {
    callback(data);
  });
};

$.when(
  apiRequest("https://jsonplaceholder.typicode.com/todos/1",myCallback),
  apiRequest("https://jsonplaceholder.typicode.com/todos/2",myCallback),
  apiRequest("https://jsonplaceholder.typicode.com/todos/3",myCallback)
).done(function() {
  if (apiSoftFail) {
    // "API Soft Fail"
    doThisFailureFunction();
  } else {
    doThisSuccessFunction();
  }
}).fail(
  // "API Hard Fail"
  doThisFailureFunction
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>