Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一次性解析单例(角度服务)_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

Javascript 一次性解析单例(角度服务)

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决议 什么样的模式才能让单身承诺第一次得到解决 决心

这个问题一般适用于承诺,而不是特定于Angular,但示例使用Angular$q和服务单例

这是

文件是

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