Jquery ajax调用将成功值分配给窗口

时间:2016-12-21 12:02:29

标签: javascript jquery ajax

我正在尝试从后端获取一些网址并在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

1 个答案:

答案 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.
    // ...
});