这个承诺示例究竟是如何运作的?

时间:2017-09-22 09:32:39

标签: javascript promise javascript-framework

我正在研究Angular 2,我对在教程中找到的代码有疑问:

  appStatus = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('stable');
    }, 2000);
  });

我知道这条指令的确是这样的:在传递2秒之后,将 appStatus 变量的值设置为字符串'stable'。这是吗?

但究竟什么是承诺呢?所以 appStatus 变量包含一个 Promise 对象引用,我认为在传递2秒后,它将包含'stable'已解析的值。但究竟是什么,包含什么?

承诺的常见用例是什么?

2 个答案:

答案 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 docsthis post by Jake Archibald