假设我们有一些像这样的HTML:
<button
id="my-login-button"
ng-hide="loggedIn"
ng-click="login()">Log me in!</button>
我们还有一个JavaScript:
// controller.js
$scope.login = function () {
API.login()
.then(function () {
console.log('login promise resolved');
});
};
// service.js
app.factory('API', ['$q', '$timeout', function ($q, $timeout) {
return {
login: function () {
var login = $q.defer();
// async login
VK.Auth.login(
function () {
// login.resolve(); // doesn't work without $timeout()
$timeout(login.resolve); // works as it should
},
VK.access.FRIENDS | VK.access.AUDIO
);
return login.promise;
}
};
}]);
这段代码正常工作,但神秘部分靠近$timeout()
函数。为什么我要解决这个问题呢?没有它,为什么代码不能按预期工作?
我不会对范围变量做些什么,我只是安慰。没有$timeout
,它将被下一个摘要调用...
至于我,没有任何意义,如果我需要更改范围道具,我会将所有内容包装在$apply
中。
有人可以解释为什么通常的延期行为会变得神秘吗?
P.S。在阅读this question answers后,我已用$timeout
解决了我的问题。
答案 0 :(得分:2)
在AngularJS中,promise结果在$ digest循环内异步传播。因此,then()的结果不会传播,直到下一个摘要周期,从而没有$timeout
或$http
或$apply
来触发一个。