在检索到 promise 之后定义 then()

Defining then() after promise has been retrieved

我对 AngularJS 中的承诺附加回调函数有疑问。

假设我有一项服务具有 returns 承诺的功能。我调用此函数并将承诺存储在本地。然后我在 promise 上定义了一个回调函数。

var promise = TestService.get();
console.log('We have a promise!');
promise.then(function (result){
  console.log('Here is the result:'+result);
});

在这种情况下,我们有一个潜在的危险情况。如果在我们到达 promise.then(... 之前解决了承诺,则结果不会输出到控制台(直到下一个摘要周期)。

或者,我可以这样写上面的代码:

TestService.get().then(function (result){
  console.log('Here is the result:'+result);
});

我的问题:

第二个例子中的风险降低了吗?如果没有,我如何确保在我附加回调之前承诺没有解决? 比 yes/no 稍微详细的答案将不胜感激:)

JavaScript 不是多线程的,您的异步 AJAX 调用在您的代码 returns.

之前实际上并没有被浏览器调用
var promise = TestService.get();
for (var i= 0;i<100000;i++){
    console.log(i)
}
console.log('We have a promise!');
promise.then(function (result){
    console.log('Here is the result:'+result);
});

使用网络分析仪观看此视频。

您所描述的行为并没有发生,这可以通过一个简单的例子看出。这里我们有一个简单的承诺工厂,它 returns 一个立即解决的承诺。

'use strict';
var make = function() {
  return new Promise(function(resolve, reject) {
    resolve(2);
  });
};

然后我们创建一个新的承诺并将其分配给一个变量

var prom = make();

我们可以根据需要多次调用 .then。这是因为承诺是不可变的,我们不会通过在其上链接方法来更改原始值。

prom.then(a => console.log(a));
// 2
prom.then(a => console.log(a));
// 2

Suppose I have a service with a function that returns a promise. I make a call to this function and store the promise locally. Then I define a callback function on the promise.

不,您没有附加回调。当你调用 then 方法时,你正在做一些叫做 promise chaining 的事情。每次调用 then returns 一个 new promise 对象,该对象将解析为前一个 promise 返回的值。

例如;

var promise1 = TestService.get();
var promise2 = promise1.then(function(value) {
                  console.log('service resolved: '+value);
                  return "Hello World";
               });
var promise3 = promise2.then(function(value) {
                  console.log(value);
               });
promise3.then(function(value) {
       console.log(value);
});

上面的例子会输出如下内容。

**some value from TestService**
Hello World
undefined

我们不知道最初是谁解析了第一个 promise 的值。我们所知道的是该服务返回了一个承诺。从那一刻起,我们可以通过添加更多对 then.

的调用来链接承诺

In this case, we have a potentially risky situation. If the promise is resolved before we get to promise.then(..., the result is not outputted to the console (until the next digest cycle).

不,承诺何时或以何种摘要解决并不重要。即使在解决后,承诺也可以多次调用 then 方法。只要它没有被拒绝,它就会继续解析到该值。解决或拒绝承诺的决定不在成功或失败回调的范围内。

您可以创建一个承诺,将其解析为一个值,等待几个摘要并向 then 添加一个处理程序,它仍然会按预期工作。

Has the risk been mitigated in the second example? And if not, how can I make sure that the promise does not resolve before I have attached a callback?

将承诺视为 容器。它们将保留您期望的值,您必须调用 then 来获取它。如果出于某种原因该值不可用,您可以使用 error 回调找出原因。 promises 的 when 方面纯粹是一个异步问题,而 promises 的想法是 hide 这些问题。