为什么我的价值在承诺后回来未定义
Why is my value coming back undefined after a promise
var result = {},
data={},
access_token = result.access_token,
baseURI = result.resource_server_base_uri;
function getToken() {
var query_string = {};
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0; i < vars.length; i++) {
var pair = vars[i].split("=");
query_string[pair[0]] = pair[1];
}
if (typeof(query_string.access_token) != "undefined") {
result.state = query_string.state;
result.scope = decodeURIComponent(query_string.scope);
result.access_token = decodeURIComponent(query_string.access_token);
result.expires_in = query_string.expires_in;
result.resource_server_base_uri = decodeURIComponent(query_string.resource_server_base_uri);
result.token_type = query_string.token_type;
}
}
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
data.sessionId = res.data.sessionId;
console.log("sessionId", data.sessionId); <---shows session Id I need to use later
});
}
console.log('SESSIONID', data.sessionId); <--- returns undefined
这段代码似乎成功地从res中获取了我需要的sessionId,但是当我尝试将它应用到初始化的数据变量对象时(类似于我对var result={}所做的,并在其他地方使用它函数,它 returns 未定义。我搞砸了什么?
之所以在外部上下文中看不到SessionId,是因为这是一个立即执行的同步代码。函数中的console.log是异步的,意思是当http-request的结果进来的时候执行。
所以(假设您实际上 运行 函数)您看不到它的原因是异步 .then()
尚未执行。
解决方案:return 承诺改为:
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
})
}
现在在其他部分(您实际需要值的地方)您可以使用 then()
来获取值。
这里的问题是执行顺序。
传递给 then 的函数中的代码是最后执行的。您需要调用所有其他需要 sessionId[=17= 的函数] 在那之后。像这样:
.then(function(res){
data.sessionId = res.data.sessionId;
console.log("sessionId", data.sessionId); <---shows session Id I need to use later
anyOtherFunction(data.sessionId);
});
function anyOtherFunction(sessionId) {
console.log('SESSIONID', sessionId); <--- not undefined
}
这是一个异步调用,当您访问 data
对象上的 属性 时,它是不存在的,因为它尚未设置。你必须做类似
的事情
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
return res.data.sessionId;
});
}
以后会这样称呼它
startSession(payload).then(function(id){
data.id = id;
// do your logic here
});
正如其他答案所写,这是一个异步值。
在我看来,最好的解决方案是在路由到需要会话 ID 的页面之前使用 resolve。
即:
angular.module('app').config(function($routeProvider) {
$routeProvider.when('need-session', {
templateUrl: 'your-page-template',
controller: 'your-page-controller',
resolve: {
sessionId: function($http) {
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
return res.data.sessionId;
});
}
});
});
然后通过控制器获取:
angular.module('app').controller('your-page-controller', function($scope, sessionId) {
//Use the sessionId as needed
});
希望有所帮助
var result = {},
data={},
access_token = result.access_token,
baseURI = result.resource_server_base_uri;
function getToken() {
var query_string = {};
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0; i < vars.length; i++) {
var pair = vars[i].split("=");
query_string[pair[0]] = pair[1];
}
if (typeof(query_string.access_token) != "undefined") {
result.state = query_string.state;
result.scope = decodeURIComponent(query_string.scope);
result.access_token = decodeURIComponent(query_string.access_token);
result.expires_in = query_string.expires_in;
result.resource_server_base_uri = decodeURIComponent(query_string.resource_server_base_uri);
result.token_type = query_string.token_type;
}
}
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
data.sessionId = res.data.sessionId;
console.log("sessionId", data.sessionId); <---shows session Id I need to use later
});
}
console.log('SESSIONID', data.sessionId); <--- returns undefined
这段代码似乎成功地从res中获取了我需要的sessionId,但是当我尝试将它应用到初始化的数据变量对象时(类似于我对var result={}所做的,并在其他地方使用它函数,它 returns 未定义。我搞砸了什么?
之所以在外部上下文中看不到SessionId,是因为这是一个立即执行的同步代码。函数中的console.log是异步的,意思是当http-request的结果进来的时候执行。
所以(假设您实际上 运行 函数)您看不到它的原因是异步 .then()
尚未执行。
解决方案:return 承诺改为:
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
})
}
现在在其他部分(您实际需要值的地方)您可以使用 then()
来获取值。
这里的问题是执行顺序。
传递给 then 的函数中的代码是最后执行的。您需要调用所有其他需要 sessionId[=17= 的函数] 在那之后。像这样:
.then(function(res){
data.sessionId = res.data.sessionId;
console.log("sessionId", data.sessionId); <---shows session Id I need to use later
anyOtherFunction(data.sessionId);
});
function anyOtherFunction(sessionId) {
console.log('SESSIONID', sessionId); <--- not undefined
}
这是一个异步调用,当您访问 data
对象上的 属性 时,它是不存在的,因为它尚未设置。你必须做类似
function startSession(startSessionPayload){
access_token = result.access_token;
baseURI = result.resource_server_base_uri;
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
return res.data.sessionId;
});
}
以后会这样称呼它
startSession(payload).then(function(id){
data.id = id;
// do your logic here
});
正如其他答案所写,这是一个异步值。 在我看来,最好的解决方案是在路由到需要会话 ID 的页面之前使用 resolve。 即:
angular.module('app').config(function($routeProvider) {
$routeProvider.when('need-session', {
templateUrl: 'your-page-template',
controller: 'your-page-controller',
resolve: {
sessionId: function($http) {
return $http({
'url': baseURI + 'services/v6.0/agent-sessions',
'method': 'POST',
'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
'data': startSessionPayload
}).then(function(res){
return res.data.sessionId;
});
}
});
});
然后通过控制器获取:
angular.module('app').controller('your-page-controller', function($scope, sessionId) {
//Use the sessionId as needed
});
希望有所帮助