什么是 Promise 对象
Promise 对象是ES6中新增的一种异步编程解决方案,它可以很好地解决异步操作的回调嵌套问题,使得代码更加简洁易懂。
Promise 有三个状态,分别为 pending
, fulfilled
和 rejected
。其中,pending
表示异步操作正在执行,fulfilled
表示异步操作执行成功,rejected
表示异步操作执行失败。调用 resolve
方法,可以将 Promise 对象状态从 pending
转换为 fulfilled
,调用 reject
方法,可以将 Promise 对象状态从 pending
转换为 rejected
。
jQuery 中的 Promise 对象
jQuery 从 1.5 版本开始,就引入了 Promise 构造函数,并将其封装在 $.Deferred()
函数中。如果你熟悉 jQuery 的 ajax 方法,可能已经接触过 $.Deferred()
对象了。
首先,我们通过一个简单示例来了解 $.Deferred()
对象。
function getData() { var deferred = $.Deferred(); $.ajax({ url: 'http://xxx.com/api/data', success: function(data) { deferred.resolve(data); }, error: function(error) { deferred.reject(error); } }); return deferred.promise(); } getData().then(function(data) { console.log(data); }, function(error) { console.log(error); });
在上述示例中,我们定义了一个名为 getData
的函数,通过 $.ajax
方法获取数据,并使用 $.Deferred()
构建一个 Deferred 对象,通过 resolve
和 reject
方法改变 Deferred 对象的状态。最后,通过 return deferred.promise()
返回一个 Promise 对象,使得异步操作的结果可以被链式调用。
在调用 getData
函数后,我们可以使用 then
方法来指定 Promise 对象状态改变时的回调函数,如果获取数据成功,则执行第一个回调函数,如果获取数据失败,则执行第二个回调函数。
Promise 对象的进阶应用
除了基本的 Promise 对象应用,还有一些进阶应用方式。比如,我们可以通过 Promise.all()
方法来将多个 Promise 对象组合为一个 Promise 对象。
function getData(id) { return $.ajax({ url: `http://xxx.com/api/data/${id}`, success: function(data) { console.log(`getData(${id}) 成功`); }, error: function(error) { console.log(`getData(${id}) 失败`); } }); } var promises = []; for (var i = 1; i <= 5; i++) { promises.push(getData(i)); } Promise.all(promises).then(function(datas) { console.log('所有 Promise 对象状态已改变'); });
在上述示例中,我们定义了一个名为 getData
的函数,其返回一个 Promise 对象。在 for
循环中,我们创建了 5 个 Promise 对象,并将其存入数组 promises
中。将 promises
数组传入 Promise.all()
方法中,返回的 Promise 对象在所有 Promise 对象状态改变后,才会将成功回调函数执行。
总结
Promise 对象在 jQuery 中的应用已经非常普遍,它可以帮助我们更好地处理异步操作,避免异步操作回调嵌套问题。除了基本的应用方法外,我们还可以通过 Promise.all()
等方法将多个 Promise 对象组合为一个 Promise 对象,从而更好地管理异步操作的完成状态。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6593bd21eb4cecbf2d861432