Angular JS 1.x - 无法将 $rootScope 变量传递给下一个函数
Angular JS 1.x - Can't pass $rootScope variable into next function
我有一个似乎无法解决的简单问题。
当我调用下一个函数时,$rootScope 中的一个变量似乎没有被赋值,但这不是 Promise (.then) 的重点吗?
我的堆栈是 AngularJS v1.6.4 和 NodeJS,但这是一个纯粹的 Angular 问题
我的代码片段在我放置 console.log 及其响应的位置下方。
mainApp.controller('navBarController', ['$scope', '$rootScope', '$http', function($scope, $rootScope, $http){
var checkIfAuthenticated = function(){
return $http.get('/api/isAuthenticated');
};
var getProfileID = function(){
return $http.get('/session');
};
var getUser = function(profileID){
console.log('This is the profileID when passed into getUser: ' + profileID); //this shows undefined
return $http.get('/api/user', {params: {_id: profileID}})
};
checkIfAuthenticated()
.then(function(res) {
if(res.status==200){
$rootScope.userLoggedIn = true;
};
})
getProfileID()
.then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profileID = res.data._id;
console.log('This is the profileID when getProfileID is called: ' + $rootScope.profileID); //this shows the correct ID
};
})
getUser($rootScope.profileID)
.then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profilePic = res.data.user.profilePic;
};
});
}]);
如果有人能解释发生了什么,我们将不胜感激。
谢谢
要将数据从一个承诺传递到另一个承诺,将它们链接起来:
checkIfAuthenticated()
.then(function(res) {
if(res.status==200){
$rootScope.userLoggedIn = true;
return getProfileID();
} else {
throw "Not Logged In";
}
}).then(function(res) {
$rootScope.profileID = res.data._id;
console.log('This is the profileID when getProfileID is called: '
+ $rootScope.profileID); //this shows the correct ID
return getUser($rootScope.profileID);
}).then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profilePic = res.data.user.profilePic;
};
});
因为调用承诺的 .then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。
有关详细信息,请参阅
我有一个似乎无法解决的简单问题。
当我调用下一个函数时,$rootScope 中的一个变量似乎没有被赋值,但这不是 Promise (.then) 的重点吗?
我的堆栈是 AngularJS v1.6.4 和 NodeJS,但这是一个纯粹的 Angular 问题
我的代码片段在我放置 console.log 及其响应的位置下方。
mainApp.controller('navBarController', ['$scope', '$rootScope', '$http', function($scope, $rootScope, $http){
var checkIfAuthenticated = function(){
return $http.get('/api/isAuthenticated');
};
var getProfileID = function(){
return $http.get('/session');
};
var getUser = function(profileID){
console.log('This is the profileID when passed into getUser: ' + profileID); //this shows undefined
return $http.get('/api/user', {params: {_id: profileID}})
};
checkIfAuthenticated()
.then(function(res) {
if(res.status==200){
$rootScope.userLoggedIn = true;
};
})
getProfileID()
.then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profileID = res.data._id;
console.log('This is the profileID when getProfileID is called: ' + $rootScope.profileID); //this shows the correct ID
};
})
getUser($rootScope.profileID)
.then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profilePic = res.data.user.profilePic;
};
});
}]);
如果有人能解释发生了什么,我们将不胜感激。
谢谢
要将数据从一个承诺传递到另一个承诺,将它们链接起来:
checkIfAuthenticated()
.then(function(res) {
if(res.status==200){
$rootScope.userLoggedIn = true;
return getProfileID();
} else {
throw "Not Logged In";
}
}).then(function(res) {
$rootScope.profileID = res.data._id;
console.log('This is the profileID when getProfileID is called: '
+ $rootScope.profileID); //this shows the correct ID
return getUser($rootScope.profileID);
}).then(function(res) {
if($rootScope.userLoggedIn === true){
$rootScope.profilePic = res.data.user.profilePic;
};
});
因为调用承诺的 .then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。
有关详细信息,请参阅