返回介绍

JavaScript 中的 Promise

发布于 2025-04-26 18:09:29 字数 1407 浏览 0 评论 0 收藏

已经有些类库实现了 Promise 的功能,如:

•Q

- when

- WinJS

- RSVP.js

这些类库和 JavaScript 原生 Promise 都遵循了一个通用的、标准化的规范:Promises/A+。当你使用 jQuery 时,会发现它也有一个类似的方法 Deferred。但是,Deferred 与 Promises/A+并不兼容,使用的时候需要谨慎。jQuery 中也有 Promise 的类型,但是它只是 Deferred 的一个子集,所以也会有上面的问题。

尽管这些类库在实现的时候都遵循统一的规范,但是他们提供的 API 接口却有差别。JavaScript 中的 API 接口同 RSVP.js 更相似,它像下面这样来创建一个 promise:

var promise = new Promise(function(resolve, reject) {
  // 类似异步操作的一些逻辑,然后

...

  if (/* 正常执行

 */) {
    resolve("Stuff worked! ");
  }
  else {
    reject(Error("It broke"));
  }
});

Promise 的构造器接受一个函数作为回调函数,同时给回调函数提供了两个参数:resolve 和 reject。我们可以在回调函数中写一些逻辑,如异步操作等,然后操作成功可以调用 resolve,失败则调用 reject。

就像过去使用“throw”一样,我们通常都会在 reject 时使用 Error 对象。这样做的好处是,它可以捕获相关的堆栈信息,所以在调试时对我们就非常有帮助了。

下面来看看如何使用 Promise:

promise.then(function(result) {
  console.log(result); // " 执行成功!

"
}, function(err) {
  console.log(err); // Error: " 出问题了

"
});

“then”函数接受两个参数,第一个作为操作成功后的回调函数,第二个作为操作失败后的回调函数。两个参数都是可选的,所以你可以只写一个成功回调函数或者失败回调函数。

JavaScript 中的 Promise 一开始是在 DOM 规范中以“Futures”命名的,后来更名为“Promise”并最终纳入 JavaScript 规范中。之所以这么做是因为它们也可以在无浏览器的 JS 上下文环境(如 Node.js)中使用。

尽管这是一个 JavaScript 特性,但在 DOM 中也可以方便地使用。事实上,在新的所有涉及异步成功/失败方法的 DOM API 中都使用了 Promise,已经实现的有 Quota Management、Font Load Events、ServiceWorker、Web MIDI、Streams 等。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。