什么是Promise对象?

3

我开始学习Ember后,每当有提及Promise对象时就感到困惑。我知道对象,例如类X的实例或JSON对象。例如,当有人说方法m返回一个JSON对象时,我知道可以期待键值对。那么我如何将这种理解与Promise对象联系起来?Promise对象是一个值吗(可以是数组、字符串、数字、JSON对象等)?

如果一个方法返回一个Promise对象,我应该期望什么?


3
JSON对象并不存在。这篇文章解释了JSON是一种基于文本的数据交换格式,而不是一个真正的编程语言或对象。虽然JSON看起来非常像JavaScript对象,但它们实际上是两个不同的东西,因为JSON缺少许多JavaScript对象所具有的功能和行为。 - nnnnnn
Json对象 - http://docs.oracle.com/javaee/7/tutorial/doc/jsonp003.htm - Bala
是的,错误的。你提到了 JSON 对象具有键值对,即属性,但对象字面量语法只是创建对象的一种方式。关于你的链接:是的,如果你读了我给你链接的文章,你会发现这样的对象被承认了,而且它们不是你在问题中谈论的内容。这并不否定我的观点。 - nnnnnn
@Qantas94Heavy:那有什么问题吗? - Bala
2
@nnnnnn JSON与JavaScript一样,都是字符串格式。JSON是一种用于描述数据的语言 - 它非常清楚地有一个对象的概念。你所抗议的(当然是正确的)是人们在JavaScript代码中将JavaScript对象字面量称为JSON对象,这确实是不正确的 - 那些是JS对象字面量而不是JSON对象。但是,{"a":3}在JSON语言中绝对是一个JSON对象 - 请参见规范或http://json.org/。 - Benjamin Gruenbaum
显示剩余7条评论
2个回答

7
一个 Promise 是 EcmaScript 6 (ES6) 的一种新的对象类型,有许多 polyfills and libaries(即 ES5 JavaScript 引擎的实现),可以使我们轻松地摆脱臭名昭著的回调地狱,轻松编写和阅读异步代码。
一个 Promise 只能有以下三种状态之一:
- pending - fulfilled - rejected 如果 Promise 被拒绝或者实现了,它也会有一个settled状态。
基本上,它是一个对象,有一个then属性(还有其他属性),它是一个函数,至少需要一个函数作为参数,也可以有两个:第一个函数将在 Promise 返回fulfilled状态时被调用,第二个函数将在 Promise 返回rejected状态时被调用。 then函数返回另一个 Promise 对象,所以 Promise 可以链式调用。

Promise对象比我刚才写的要复杂得多,但这只是为了让你有个开始。

顺便说一下,如果您使用jQuery,则可能已经使用了类似Promise的对象(请注意-like后缀):$.ajax()返回一个类似Promise的对象(称为thenable),该对象具有done(和then)属性,它是一个函数,接受一个函数作为参数,该函数看起来像一个fulfilled函数(通常只需要一个参数)。 Promise对象也可以具有done函数属性(据我所知,这不是标准化的,但几乎所有的polyfill和库都实现了它),它的作用类似于then函数,只是它不返回Promise(因此名称:如果您完成了Promise,则使用done(),但如果您需要对Promise的结果进行某些操作,则使用then())。

例如:您可能已经看到或编写了类似以下内容的代码:

$.ajax({url: '/path/to/html/piece'})
    .done(function(data) {
        $('whateverSelector').html(data);
    });

但是,即使它们是"thenable",jQuery所称之为承诺的东西并没有满足promise spec

对于一个问题问得不好的情况,这是一个很好的回答。值得一提的是,.done 的目的是什么。此外 - 根据规范,类似 Promise 的对象被称为 "thenable" - 由于您在此答案的其余部分术语使用得非常准确,因此您可能需要提及这一点。 - Benjamin Gruenbaum
谢谢,我根据(希望)您的意见修改了我的答案。 - laruiss

5

Promise对象就像它的名字一样 - 是一个承诺。在像Ember和Angular这样的前端框架中,Promise是异步调用返回的对象。这个调用不会阻塞整个系统,而是返回一个承诺,其中最终将包含异步调用返回的数据。

Promise有一个被称为“resolve”的事件,在响应到达时触发。这就是为什么Promise对象通常具有名为then的方法。你可以像这样使用它(在Ember.js文档之后):

var promise = fetchTheAnswer();

promise.then(fulfill, reject);

function fulfill(answer) {
  console.log("The answer is " + answer);
}

function reject(reason) {
  console.log("Couldn't get the answer! Reason: " + reason);
}

当您的请求被满足时,Promise会调用方法fulfill并将answer(响应)作为参数传递,当请求被拒绝时(即资源不存在时),它将调用方法reject并将reason(错误)作为参数传递。
这些对象类似于其他面向对象语言(如Java)中的对象-它们包含数据和可以调用的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接