所以这很奇怪。$rootScope
在函数中正确设置,但随后失去其价值。如果我使用承诺,我只能保持价值。(!?)
我正在使用 trigger.io (Forge) AJAX 请求,成功后我更新$rootScope.queries
. 在成功块内,$rootScope.queries
设置正确,如alert
.
.run(function($rootScope, $state, $q) {
var retrieveHistory = function() {
forge.logging.log("Retrieving history");
// Retrieve the history
forge.request.ajax({
type: 'GET',
url: 'http://localhost:9000/json',
dataType: 'json',
success: function (data) {
$rootScope.queries = data["queries"];
alert("queries " + JSON.stringify($rootScope.queries));
},
error: function (error) {
}
});
}
retrieveHistory();
虽然此时,afterretrieveHistory()
已被调用,$rootScope.queries
现在是空的。视图没有更新,使用 Chrome 控制台检查显示它是空的。
假设我向函数添加了一个 Promise,但实际上并没有将 Promise 用于任何事情。
.run(function($rootScope, $state, $q) {
var retrieveHistory = function() {
var deferred = $q.defer();
forge.logging.log("Retrieving history");
// Retrieve the history
forge.request.ajax({
type: 'GET',
url: 'http://localhost:9000/json',
dataType: 'json',
success: function (data) {
$rootScope.queries = data["queries"];
alert("queries " + JSON.stringify($rootScope.queries));
},
error: function (error) {
deferred.reject("error " + JSON.stringify(error));
}
});
return deferred.promise;
}
var promise = retrieveHistory();
promise.then();
有了这个承诺,就$rootScope.queries
保持它的价值。视图更新,Chrome 检查器显示该值设置正确。
为什么是这样?我根本不理解这种行为。为什么我不能保留$rootScope.queries
原始代码中的值?为什么承诺会保持价值?