【问题标题】:Jquery ajax call assigned success val to windowJquery ajax调用将成功val分配给窗口
【发布时间】:2016-12-21 12:02:29
【问题描述】:

我正在尝试从后端获取一些 url 并在 window.__env.{variable} 中分配 data.Results,以便我可以在应用程序的任何地方使用它。

我有这个代码

(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 我想在其中使用 window.__env 但它给了我@ 987654327@.

但是,如果我像这样在没有 ajax 调用的情况下传递它,它就可以正常工作。

(function(window){
window.__env = window.__env || {};
     window.__env.saveWorkflowDefinition= 'www.mybaseurl.com/api/Management/';
   })

在进行 ajax 调用时,当我将它传递给 xfunction.js 时,有人能指出为什么它返回 undefined 吗?

【问题讨论】:

  • 通过window.__env.saveWorkflowDefinitionxfunction.js 它给了我未定义。 我没明白,xfunction.js 到底是什么?
  • 它是我要使用的另一个文件window.__env.
  • 我怀疑,您试图在数据定义之前访问数据。由于您是异步分配数据的,因此没有预定义的时间会发生这种情况。
  • 您确定在 Ajax 完成后尝试访问 window.__env.saveWorkflowDefinition 吗?我不是在问您是否在调用函数workflowDefinition 之后访问window.__env.saveWorkflowDefinition,而是在异步ajax 完成加载之后。你如何确定这一点?
  • 我建议你在xfunction.js 中使用这个ajax 脚本,这样你就可以使用promise/deferred 对象来监控ajax 请求的完成情况,这很容易做到

标签: javascript jquery ajax


【解决方案1】:

由于您的 Ajax 调用只会异步提供响应,因此您不能期望在相同的同步执行上下文中获得响应。

解决这个问题的一个想法是放弃将响应存储在全局(窗口)属性中的想法,而是存储一个您确实同步获得的承诺。

代码可能如下所示:

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

【讨论】:

  • 它显示Declration or statement expected and expected ; 当我把那行代码//Other file.
  • window.promiseWorkFlowDefinition.then(saveWorkflowDefinition) { // Use saveWorkflowDefinition here. This is called asynchronously. // ... }); 这个在文本编辑器中显示错误。
  • 修复了最后几行的语法错误:functionthen 之后丢失。
  • 那么我可以在该行中执行console.log(saveWorkflowDefinition‌) 之类的操作吗?
  • 是的,我试过了,但还是给了我undefined
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
相关资源
最近更新 更多