📜  JQuery deferred.then() 方法(1)

📅  最后修改于: 2023-12-03 14:43:08.881000             🧑  作者: Mango

JQuery Deferred.then() 方法

JQuery Deferred.then() 方法是在 JQuery 1.5 版本中引入的,它是 Promise/A+ 标准的实现,提供了一种异步编程的解决方案。该方法在之前的版本中被称为 pipe() 方法,在新版本中更名为 then()。

语法

deferred.then(doneCallbacks[, failCallbacks[, progressCallbacks]])

参数:

  • doneCallbacks (可选):一个或多个回调函数,在 Deferred 对象的状态已变为 "resolved" 时调用,每个回调的参数由 Deferred 对象的 resolve() 方法传递。
  • failCallbacks (可选):一个或多个回调函数,在 Deferred 对象的状态已变为 "rejected" 时调用,每个回调的参数由 Deferred 对象的 reject() 方法传递。
  • progressCallbacks (可选):一个或多个回调函数,在 Deferred 对象的状态为 "pending" 时调用,每个回调的参数由 Deferred 对象的 notify() 方法传递。

返回值:

一个新的 Deferred 对象,用于链式调用。

示例:

var deferred = $.Deferred();
deferred.then(function(result) {
  console.log(result); // 输出 "Hello World"
  return "Hello Universe";
}).then(function(result) {
  console.log(result); // 输出 "Hello Universe"
});
deferred.resolve("Hello World");
功能

JQuery Deferred.then() 方法可以在前一个 Deferred 对象完成后执行一个或多个回调函数,并返回一个新的 Deferred 对象,可以实现链式调用。

当调用 resolve() 方法时,会按照链上的顺序依次执行所有已注册的成功回调函数。如果在回调函数中返回了另外一个 Deferred 对象,该 Deferred 对象将作为一个新的参数返回给下一个回调函数,如果返回的是普通值,则将该值作为一个新的参数传递给下一个回调函数。如果没有返回值,则默认传递 undefined 给下一个回调函数。

当调用 reject() 方法时,会按照链上的顺序依次执行所有已注册的失败回调函数,并将错误信息传递给下一个回调函数。

如果在链执行过程中发生了错误,会立即触发最近的一个失败回调函数,并且不会再执行链上的其它回调函数。

实例

下面是一个使用 JQuery Deferred.then() 方法的实例:

function loadData() {
  var deferred = $.Deferred();
  $.get("data.json").done(function(result) {
    console.log(result);
    deferred.resolve("Load Data Success!");
  }).fail(function(xhr, status, error) {
    console.log(error);
    deferred.reject("Load Data Error!");
  });
  return deferred.promise();
}

loadData().then(function(result) {
  console.log(result); // 输出 "Load Data Success!"
  return "Process Data Success!";
}).then(function(result) {
  console.log(result); // 输出 "Process Data Success!"
}).fail(function(error) {
  console.log(error); // 输出 "Load Data Error!"
});
不足之处

JQuery Deferred.then() 方法可以实现串行执行异步任务,但在并行执行异步任务时就会遇到麻烦。如果需要并行执行多个异步任务,可以使用 JQuery.when() 方法。另外,在链式调用过程中,如果有些回调函数需要共享数据,就需要在回调函数之外传递一个闭包或对象来保存数据。

结论

JQuery Deferred.then() 方法是 JQuery 提供的实现异步编程的解决方案之一,它具有可读性强、代码简洁等优点,但并不适用于所有的异步编程场景。在使用中,需要注意传递数据的方式和异步任务的执行顺序。