我开始学习Ember后,每当有提及Promise对象时就感到困惑。我知道对象,例如类X的实例或JSON对象。例如,当有人说方法m
返回一个JSON对象时,我知道可以期待键值对。那么我如何将这种理解与Promise对象联系起来?Promise对象是一个值吗(可以是数组、字符串、数字、JSON对象等)?
如果一个方法返回一个Promise对象,我应该期望什么?
我开始学习Ember后,每当有提及Promise对象时就感到困惑。我知道对象,例如类X的实例或JSON对象。例如,当有人说方法m
返回一个JSON对象时,我知道可以期待键值对。那么我如何将这种理解与Promise对象联系起来?Promise对象是一个值吗(可以是数组、字符串、数字、JSON对象等)?
如果一个方法返回一个Promise对象,我应该期望什么?
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);
});
.done
的目的是什么。此外 - 根据规范,类似 Promise 的对象被称为 "then
able" - 由于您在此答案的其余部分术语使用得非常准确,因此您可能需要提及这一点。 - Benjamin GruenbaumPromise对象就像它的名字一样 - 是一个承诺。在像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);
}
fulfill
并将answer
(响应)作为参数传递,当请求被拒绝时(即资源不存在时),它将调用方法reject
并将reason
(错误)作为参数传递。
{"a":3}
在JSON语言中绝对是一个JSON对象 - 请参见规范或http://json.org/。 - Benjamin Gruenbaum