Javascript 一次性解析单例(角度服务)
这个问题一般适用于承诺,而不是特定于Angular,但示例使用Angular$q和服务单例 这是 文件是Javascript 一次性解析单例(角度服务),javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,这个问题一般适用于承诺,而不是特定于Angular,但示例使用Angular$q和服务单例 这是 文件是 <body ng-app="app"> <div ng-controller="AController"></div> <div ng-controller="BController"></div> </body> 它将自然输出 决心 B决议 什么样的模式才能让单身承诺第一次得到解决 决心
<body ng-app="app">
<div ng-controller="AController"></div>
<div ng-controller="BController"></div>
</body>
它将自然输出
决心
B决议
什么样的模式才能让单身承诺第一次得到解决
决心
而不是后来的时代
类似于onetimeResolvingService.$$state.status=2
的东西可能会起作用,但它看起来像$q hack,而且气味很难闻
什么样的模式才能让单身承诺第一次得到解决
不去。承诺的一个关键方面是,一旦解决,它就解决了,并且解决状态(已解决或已拒绝)和价值在该点不变。参见以下文件的§2.1.2和§2.1.3:
2.1.2履行时,承诺:
2.1.2.1不得过渡到任何其他状态
2.1.2.2必须有一个值,该值不得改变
2.1.3被拒绝时,承诺:
2.1.3.1不得过渡到任何其他状态
2.1.3.2必须有一个不能改变的理由
如果通过添加的回调在某个阶段(例如,您的第二次连接)不满意,则这不是承诺。这是另一回事
什么样的模式才能让单身承诺第一次得到解决
不去。承诺的一个关键方面是,一旦解决,它就解决了,并且解决状态(已解决或已拒绝)和价值在该点不变。参见以下文件的§2.1.2和§2.1.3:
2.1.2履行时,承诺:
2.1.2.1不得过渡到任何其他状态
2.1.2.2必须有一个值,该值不得改变
2.1.3被拒绝时,承诺:
2.1.3.1不得过渡到任何其他状态
2.1.3.2必须有一个不能改变的理由
如果通过添加的回调在某个阶段(例如,您的第二次连接)不满意,则这不是承诺。这是另一回事。T.J.Crowder是正确的,因为您在promise中寻找的功能并不存在。然而,如何实现您所追求的目标的问题可以在如下结构中找到:
function OnetimeValue($q) {
var promisedValue = $q(function(resolve, reject) {
setTimeout(function () {resolve('The one time value');}, 500);
});
var valueGot = false;
this.GetValue = function GetValue() {
var res;
if (!valueGot) {
res = promisedValue;
} else {
res = $q(function(resolve, reject) {
resolve(null);
});
}
valueGot = true;
return res;
};
}
假设您new
这一次(与angular services一样),GetValue()将在第一次调用时返回promisified字符串。后续调用返回null
显示了上述操作T.J.Crowder是正确的,因为您在promise中寻找的功能不存在。然而,如何实现您所追求的目标的问题可以在如下结构中找到:
function OnetimeValue($q) {
var promisedValue = $q(function(resolve, reject) {
setTimeout(function () {resolve('The one time value');}, 500);
});
var valueGot = false;
this.GetValue = function GetValue() {
var res;
if (!valueGot) {
res = promisedValue;
} else {
res = $q(function(resolve, reject) {
resolve(null);
});
}
valueGot = true;
return res;
};
}
假设您new
这一次(与angular services一样),GetValue()将在第一次调用时返回promisified字符串。后续调用返回null
显示了上面的操作编辑:哇,误读了问题
现在有一种方法可以通过EcmaScript实现这一点。static Promise.resolve()方法接受承诺并等待其值;如果已经解析,它只返回值
例如,我们使用此方法使多个对fetchQuery的调用依赖于单个异步身份验证调用:
fetchQuery获取具有以下内容的身份验证令牌(JWT):
AuthToken看起来像(TypeScript):
类身份验证令牌{
私有静态承诺:承诺;
公共静态异步get(){
如果(!此._)
this.\u accessTokenPromise=this.AuthFunction();//AuthFunction返回一个承诺
返回等待承诺。解决(此承诺);
}
}
或者只需根据OP的问题对同一个promise对象调用then()两次,让两个调用等待同一个异步操作。编辑:哎哟,误读了问题
现在有一种方法可以通过EcmaScript实现这一点。static Promise.resolve()方法接受承诺并等待其值;如果已经解析,它只返回值
例如,我们使用此方法使多个对fetchQuery的调用依赖于单个异步身份验证调用:
fetchQuery获取具有以下内容的身份验证令牌(JWT):
AuthToken看起来像(TypeScript):
类身份验证令牌{
私有静态承诺:承诺;
公共静态异步get(){
如果(!此._)
this.\u accessTokenPromise=this.AuthFunction();//AuthFunction返回一个承诺
返回等待承诺。解决(此承诺);
}
}
或者根据OP的问题对同一个promise对象简单地调用then()两次,让两个调用在同一个异步操作上等待。如果使用lodash
,您只需像这样使用memoize
:
const returnFirstRunResultAlways=uz.memoize(异步函数(参数){…})
如果您使用的是lodash
,您只需像这样使用memoize
:
const returnFirstRunResultAlways=uz.memoize(异步函数(参数){…})
据我所知,它的工作方式与您的想法不同。单身的承诺只解决一次。然而,每个控制器中有两个独立的.thens,与承诺相链接。这两个.THEN(更准确地说是它们的回调)保证始终响应相同的结算状态-已解决或已拒绝。当然,这两个控制器对和解的响应方式可能完全不同,但这只是说明了一个明显的问题。现在可以通过Promise.resolve()实现这一点(见下文)。据我所知,它的工作方式与您所想的不同。单身的承诺只解决一次。但是,每个控制器中有两个独立的.THEN链接到
const authToken = await AuthToken.get();
class AuthToken {
private static _accessTokenPromise: Promise<string>;
public static async get() {
if (!this._accessTokenPromise)
this._accessTokenPromise = this.AuthFunction(); // AuthFunction returns a promise
return await Promise.resolve(this._accessTokenPromise);
}
}