我有一个关于在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);
});
使用网络分析仪观看。