我正在尝试从后端获取一些网址并在data.Results
中分配window.__env.{variable}
,以便我可以在应用程序的任何位置使用它。
我有这段代码
(function(window){
window.__env = window.__env || {};
$.ajax({
url: './assets/js/config/config.json',
method: 'GET',
success: function (data) {
let baseUrl = data.BaseApiUrl;
workflowDefinition(baseUrl);
}
})
function workflowDefinition(baseUrl) {
$.ajax({
url: baseUrl + 'api/Management/Configurations?name=SaveWorkflowDefinition&name=WorkflowDefinition',
method: 'GET',
success: function (data) {
if (data && data.Results && data.Results[0] && data.Results[0].Value) {
window.__env.saveWorkflowDefinition = data.Results[0].Value;
console.log(window.__env.saveWorkflowDefinition);
}
if (data && data.Results && data.Results[1].Value) {
window.__env.getWorkflowDefinition = data.Results[1].Value;
}
},
error: function (error) {
var errorMessage = "Failed to contact Workflow Server, please contact your IT administrator";
alert(errorMessage);
}
})
}
}(this))
我可以看到console.log正在打印,当它加载它时会给我正确的URL,然后我尝试传递window.__env.saveWorkflowDefinition
来说出我要使用的另一个文件xfunction.js
{{1}但它给了我window.__env
。
但是,如果我在没有ajax调用的情况下像这样传递它,它可以正常工作。
undefined
当有人在执行ajax调用时将其传递给(function(window){
window.__env = window.__env || {};
window.__env.saveWorkflowDefinition= 'www.mybaseurl.com/api/Management/';
})
时,是否可以指出为什么返回undefined
?
答案 0 :(得分:0)
由于您的Ajax调用只会异步提供响应,因此您不能指望在同一个同步执行上下文中获得响应。
解决这个问题的一个想法是放弃将响应存储在全局(窗口)属性中的想法,而是存储一个你做同步获取的promise。
代码可能如下所示:
window.promiseWorkFlowDefinition = $.ajax({
url: './assets/js/config/config.json',
method: 'GET',
}).then(function (data) {
return $.ajax({
url: data.BaseApiUrl + 'api/Management/Configurations?'
+ 'name=SaveWorkflowDefinition&name=WorkflowDefinition',
method: 'GET',
})
}).then(function (data) {
return data && data.Results && (data.Results[0] && data.Results[0].Value
|| data.Results[1] && data.Results[1].Value)
|| ('No Results[0 or 1].Value found in:\n' + JSON.stringify(data));
}, function (error) {
var errorMessage =
"Failed to contact Workflow Server, please contact your IT administrator";
alert(errorMessage);
});
// Other file:
window.promiseWorkFlowDefinition.then(function(saveWorkflowDefinition) {
// Use saveWorkflowDefinition here. This is called asynchronously.
// ...
});