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



我有一个关于在AngularJS中将回调函数附加到promise的问题。

假设我有一个带有返回promise的函数的服务。我调用这个函数并将promise存储在本地。然后我在promise上定义了一个回调函数。

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

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

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

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

我的问题:

第二个例子中的风险是否得到了缓解?如果没有,在我附加回调之前,我如何确保承诺不会得到解决?一个比是/否稍微详细一点的答案将不胜感激:)

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

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

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

var prom = make();

我们可以打电话。然后我们想打多少次就打多少次。这是因为承诺是不可变的,我们不会通过在其上链接方法来更改原始值

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

假设我有一个带有返回promise的函数的服务。我调用这个函数并将promise存储在本地。然后我在promise上定义了一个回调函数。

不,您没有附加回调。当您调用then方法时,您正在执行名为承诺链接的操作。每次调用都会返回一个新的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在我们到达promise之前被解析,那么(…,结果不会输出到控制台(直到下一个摘要周期)。

不,承诺何时或以何种方式得到解决并不重要。promise可以多次调用它的然后方法,即使在解析之后也是如此。只要没有被拒绝,它将继续解析为该值。解决或拒绝承诺的决定不在成功或失败回调的范围内。

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

第二个例子中的风险是否得到了缓解?如果没有,在我附加回调之前,我如何确保承诺不会得到解决?

将承诺视为容器。它们将保存您期望的值,您必须调用然后才能获得它。如果由于任何原因该值不可用,您可以使用错误回调来找出原因。promise的when方面纯粹是一个异步问题,其思想是让promise隐藏这些问题。

JavaScript不是多线程的,在代码返回之前,浏览器实际上不会进行异步AJAX调用。

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);
});

使用网络分析仪观看。

最新更新