所以,我被困在这里很可能是因为我对promise object的理解有限。
我从工厂获取数据的函数是
$scope.getLogoFromService = function() {
console.log('getLogoFromService called');
var promise =
logoService.getLogo();
promise.then(
function(payload) {
console.log(payload.data.home_header.logo.file_path);
$scope.logoPath = payload.data.home_header.logo.file_path;
},
function(errorPayload) {
$log.error('failure loading logo', errorPayload);
});
};
如果我{{logoPath}},我在视图中可以访问变量,当我在函数内部访问console.log但在其他函数中无法访问时。
$scope.UpdateLogo = function ()
{
console.log('UpdateLogo called');
console.log($scope.logoPath);
}
返回undefined。
我的服务代码,以防您需要查看
App.factory('logoService', function($http) {
return {
getLogo: function() {
return $http.get('cms/general');
}
}
});
答案 0 :(得分:1)
看起来您在http呼叫返回之前正在呼叫UpdateLogo
,我建议您这样处理:
$scope.getLogoFromService = function() {
console.log('getLogoFromService called');
var promise = logoService.getLogo();
promise.then(
function(payload) {
console.log(payload.data.home_header.logo.file_path);
$scope.logoPath = payload.data.home_header.logo.file_path; // For use in the view.
return $scope.logoPath; // Return the logopath to the next function in the chain.
},
function(errorPayload) {
$log.error('failure loading logo', errorPayload);
}
);
return promise;
};
$scope.UpdateLogo = function() {
console.log('UpdateLogo called');
$scope.getLogoFromService().then(function(logoPath) {
console.log('getLogoFromService resolved!');
console.log(logoPath);
});
}
由于logoPath
被分配到范围,因此您在技术上不必担心将其传递到承诺链,但这是最佳做法,所以我先建议它,或者这将是也工作:
$scope.getLogoFromService = function() {
console.log('getLogoFromService called');
var promise = logoService.getLogo();
promise.then(
function(payload) {
console.log(payload.data.home_header.logo.file_path);
$scope.logoPath = payload.data.home_header.logo.file_path; // For use in the view.
},
function(errorPayload) {
$log.error('failure loading logo', errorPayload);
}
);
return promise;
};
$scope.UpdateLogo = function() {
console.log('UpdateLogo called');
$scope.getLogoFromService().then(function() {
console.log('getLogoFromService resolved!');
console.log($scope.logoPath);
});
}
在这种情况下,我们只是使用承诺作为"数据现在可用"通知,但我们实际上并未传递数据,因为它已分配给$scope
,并且两个功能都可以访问该数据。
整个事情也可以压缩成一个更简单的功能,但我保持原始结构的完整。