gpt4 book ai didi

javascript - 一次性解析 promise 单例(Angular 服务)

转载 作者:行者123 更新时间:2023-11-30 07:36:17 24 4
gpt4 key购买 nike

这个问题一般适用于 promise ,并不特定于 Angular,但该示例使用了 Angular $q 和服务单例。

这里是 a plunker

var app = angular.module('app', []);

app.factory('onetimeResolvingService', function ($q) {
var promise = $q(function(resolve, reject) {
setTimeout(function () {
resolve();
}, 500);
});

return promise;
});

app.controller('AController', function (onetimeResolvingService, $q) {
onetimeResolvingService.then(function () {
console.log('A resolved');
return $q.reject();
}).then(function () {
console.log('A resolved');
});
});

app.controller('BController', function (onetimeResolvingService, $q) {
onetimeResolvingService.then(function () {
console.log('B resolved');
return $q.reject();
}).then(function () {
console.log('B resolved');
});
});

文档是

  <body ng-app="app">
<div ng-controller="AController"></div>
<div ng-controller="BController"></div>
</body>

自然会输出

A resolved

B resolved

什么是使单例 promise 仅在第一次解析的好模式,即

A resolved

而不是随后的时间?

onetimeResolvingService.$$state.status = 2 之类的东西可能可以解决问题,但它看起来像 $q hack 并且味道不好。

最佳答案

What would be a good pattern to make the singleton promise resolve only the first time

不要。 promise 的一个关键方面是,一旦它被解决,它就被解决了,并且解决状态(解决或拒绝)和值(value)在那个时候都不会改变。参见 the A+ promises spec 的 §2.1.2 和 §2.1.3 :

2.1.2 When fulfilled, a promise:

  2.1.2.1 must not transition to any other state.

  2.1.2.2 must have a value, which must not change.

2.1.3 When rejected, a promise:

  2.1.3.1 must not transition to any other state.

  2.1.3.2 must have a reason, which must not change.

如果通过 then 添加的回调在某个阶段不满足(例如,您的第二次连接),则这不是一个 promise 。这是……其他的东西。

关于javascript - 一次性解析 promise 单例(Angular 服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com