Javascript 如何从函数返回承诺?

Javascript 如何从函数返回承诺?,javascript,angularjs,promise,Javascript,Angularjs,Promise,函数getIdentityTokenDecrypted让我很为难。我想将decryptoken服务B的承诺返回给getToken服务A,以检索令牌 以下是我需要的步骤: 获取outlookService.mailbox.getUserIdentityTokenAsyncresult。(提供加密令牌) 通过$http路由/api/exchange/createAndValidateIdentityToken解密令牌。此请求返回我在服务A中需要的令牌 我怎样才能让它工作 /*** SERVICE A

函数
getIdentityTokenDecrypted
让我很为难。我想将
decryptoken
服务B的承诺返回给
getToken
服务A,以检索令牌

以下是我需要的步骤:

  • 获取
    outlookService.mailbox.getUserIdentityTokenAsync
    result。(提供加密令牌)
  • 通过
    $http
    路由
    /api/exchange/createAndValidateIdentityToken
    解密令牌。此请求返回我在服务A中需要的令牌
  • 我怎样才能让它工作

    /*** SERVICE A ***/
    
    var service = {
        /*...*/
        token: getToken()
    };
    
    return service;
    
    function getToken() {
        var token;
    
        serviceB.getIdentityTokenDecrypted()
            .then(function successCallback(response) {
                token = response.data.UniqueUserIdentification;
                return token;
            }, function errorCallback(response) {
                return null;
            });
    }
    
    /*** SERVICE B ***/
    
    function getIdentityTokenDecrypted() {
        var token = null;
        var promise;
    
         // This async call does not return a promise,
         // I don't think I can chain after it.
         outlookService.mailbox.getUserIdentityTokenAsync(function (res) {
             token = res;
         });
    
         // That's why I use an interval
         promise = $interval(function () {
             if (token != null) {
                 $interval.cancel(promise);
                 return decryptToken();
             }
         }, 100);
    
         function decryptToken() {
             var location = window.location.href;
    
             // I need to get the 'data' from the success
             // of this request to retrieve the token
             return $http({
                 method: "POST",
                 url: "/api/exchange/createAndValidateIdentityToken",
                 data: JSON.stringify({
                     userIdentityToken: token,
                     location: location
                 })
             });
         };
         return promise;
    };
    

    由于
    outlookService.mailbox.getUserIdentityTokenAsync
    提供回调,因此不需要
    $interval
    。您可以通过创建自己的承诺(在不可避免的情况下,这是可以的),然后使用您从
    $http
    获得的承诺(在触发
    getUserIdentityTokenAsync
    的回调之前,您不会这样做)来承诺为您提供回调的任何异步函数

    我不“做”有棱角的,但显然更像ES2015:

    promise = $q(function(resolve, reject) {
        outlookService.mailbox.getUserIdentityTokenAsync(function (res) {
            if (/*...presumably there's some failure condition...*/) {
                reject(/*...*/);
            } else {
                token = res;
                resolve(decryptToken());
            }
        });
    });
    
    (我可能还会修改
    decryptoken
    以接受该令牌作为参数,而不是使用
    token
    变量。)


    关键在于,如果您用另一个承诺解析一个承诺,它将通过链传播。

    因为
    outlookService.mailbox.getUserIdentityTokenAsync
    提供回调,您不需要
    $interval
    。您可以通过创建自己的承诺(在不可避免的情况下,这是可以的),然后使用您从
    $http
    获得的承诺(在触发
    getUserIdentityTokenAsync
    的回调之前,您不会这样做)来承诺为您提供回调的任何异步函数

    我不“做”有棱角的,但显然更像ES2015:

    promise = $q(function(resolve, reject) {
        outlookService.mailbox.getUserIdentityTokenAsync(function (res) {
            if (/*...presumably there's some failure condition...*/) {
                reject(/*...*/);
            } else {
                token = res;
                resolve(decryptToken());
            }
        });
    });
    
    (我可能还会修改
    decryptoken
    以接受该令牌作为参数,而不是使用
    token
    变量。)


    关键在于,如果你用另一个承诺来解析一个承诺,它将在链中传播。

    第一个参数是回调方法:尽管它会导致同样的问题,我不知道如何从此回调函数返回$hhtp调用的承诺。第一个参数是回调方法:虽然它会导致相同的问题,但我不知道如何从该回调函数返回$hhtp调用的承诺。“使用回调,而不是$interval”,你是对的,这毫无意义。^^@Elfayer:我很不好意思地说,直到我写完大部分答案,我才注意到你在使用回调,答案开头是同一段,后面跟着“但这并不能改变你必须以某种方式从回调情况中得到承诺”的事实,然后展示了上述内容,但是随着时间的推移。幸运的是我及时抓住了它。:-)但现在我已经完全删除了第一段,它没有任何作用。因为这是AngularJS OP所说的,所以最好还是用它来代替。它的语法几乎相同,但被包装在一个
    $watch
    @Guilherme中。我查看了它,我没有真正使用手动创建承诺,因为$http返回一个承诺。@Guilherme:谢谢。我猜。如果你想用正确的语法复制上面的答案,我很乐意为你删除这一条。或者我认为你可以建议编辑,即使你不能直接编辑。“使用回调,而不是$interval”,你是对的,这毫无意义。^^^@Elfayer:我很不好意思地说,直到我写完大部分答案,我才注意到你在使用回调,答案开头是同一段,后面是“但这并不能改变这样一个事实,即你必须以某种方式从回调情况中得到承诺“然后展示了上面的内容,但是有间隔。幸运的是我及时抓住了它。:-)但现在我已经完全删除了第一段,它没有任何作用。因为这是AngularJS OP所说的,所以最好还是用它来代替。它的语法几乎相同,但被包装在一个
    $watch
    @Guilherme中。我查看了它,我没有真正使用手动创建承诺,因为$http返回一个承诺。@Guilherme:谢谢。我猜。如果你想用正确的语法复制上面的答案,我很乐意为你删除这一条。或者我认为你可以建议编辑,即使你不能直接编辑。