我正在研究Angular 2,我对在教程中找到的代码有疑问:
appStatus = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('stable');
}, 2000);
});
我知道这条指令的确是这样的:在传递2秒之后,将 appStatus 变量的值设置为字符串'stable'。这是吗?
但究竟什么是承诺呢?所以 appStatus 变量包含一个 Promise 对象引用,我认为在传递2秒后,它将包含'stable'已解析的值。但究竟是什么,包含什么?
承诺的常见用例是什么?
答案 0 :(得分:3)
appStatus 值不是字符串' stable '如你想象的。 appStatus值在这里是一个承诺对象,它承诺你的字符串' stable' (你会在2秒后得到它)。要获得价值' 稳定'从承诺(你在2秒的持续时间结束时得到它),你必须这样做:
appStatus.then((result) => { console.log(result); });
答案 1 :(得分:1)
Prom用于JS的很多方面,angular是一个小例子。长话短说,Promises是.then
能够对象。如果您曾经使用过,例如xhr(XMLHttpRequest
),您可以认为.then(x)
的行为类似于xhr.onload = x
,但是此构造允许使用更强大的代码。这两段代码以非常相同的方式行事:
// callback "format"
const xhr = new XMLHttpRequest;
xhr.open('GET', '/api/some-query');
xhr.onload = () => { console.log(xhr.response); };
xhr.send();
// promise "format"
const xhrPromise = new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest;
xhr.open('GET', '/api/some-query');
// bad error handling, but proves the point
xhr.onload = () => { resolve(xhr.response); };
xhr.send();
});
xhrPromise.then((text) => { console.log(text); });
你有什么使用承诺模式。为了更容易理解,这里有一个使用回调模式的类似部分:
setTimeout(() => { f('stable') }, 2000);
这假设您将此附加到当前代码:
appStatus.then((status) => { f(status) });
一开始可能不是很清楚,但是一旦你深入研究并发现promises是可链接的(appStatus.then(...).then(...)
),错误处理如何与.catch
类似,很容易爱上他们
有很多好的阅读可以理解承诺是如何运作的,例如the MDN docs和this post by Jake Archibald