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:谢谢。我猜。如果你想用正确的语法复制上面的答案,我很乐意为你删除这一条。或者我认为你可以建议编辑,即使你不能直接编辑。