javascript - 这是 JavaScript/JQuery 中的范围问题吗?

标签 javascript jquery

<分区>

Possible Duplicate:
Is it posible to use ajax respone outside of it?

我创建了以下 JavaScript 例程,它转到 WCF oData 服务并获取一些数据。在 success 元素中,我将结果放入 results 变量中并提醒他们 - 我看到返回了对象。当我在 ajax 调用之外和返回结果之前运行第二个警报时,结果变量是“未定义的”。

谁能告诉我哪里出错了?

function retrieveJsonpODataSet(baseUrl, query)
{
  var oDataUrl = baseUrl + "?$format=json&$callback=?";
  var results;

  $.ajax(
  {
    url: oDataUrl,
    contentType: 'application/json; charset=utf-8',
    type: 'GET',
    dataType: 'jsonp',
    async: false,
    success: 
      function (data, textStatus, xhr) 
      {
          results = data.d;
          alert(results);  // This shows the results
      },
    error: 
      function (xhr, textStatus, errorThrown) 
      { 
          alert("Query failed.\n\n" + oDataUrl + "\n\n" + errorThrown);
          results = null;
      }
  });
  alert(results);  // This shows "undefined"
  return results;
}

请忽略查询参数 - 我还没有完成例程。

编辑

最初我在 ajax 调用中没有 async:false。我现在已经添加了它,但它并没有解决问题。

最佳答案

ajax 调用是一个异步操作。它会触发,您的代码不会就此停止。所以 results 被返回,此时它是未定义的。您需要做的是将回调传递给函数。

function retrieveJsonpODataSet(baseUrl, query, callback) {
   /* some code */
   $.ajax({
       /* some settings */
       success: function(res) {
           /* some code */
           callback(results);
       }
   });
}

现在你这样使用它

retrieveJsonpODataSet(baseUrl, query, function(res) {
    /* Hurray, I have result now in res variable! */
});

不要使用 async: false 选项!它会阻止 ALL 脚本,直到调用结束......如果它根本没有完成怎么办?您将永远被阻止。

编辑

我没注意到请求是 JSONP。在这种情况下,async: false 甚至不会工作(它不适用于跨域请求和 JSONP)。所以无论如何你都必须使用回调。

关于javascript - 这是 JavaScript/JQuery 中的范围问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11205783/

相关文章:

javascript - Electron 和 NodeJS 项目管理

javascript - 如果元素被不同的脚本更改,则动态更改该元素

javascript - 限制 Jekyll Search 中的搜索结果

jquery - "$(document).on(' pageshow '"不适用于 jQuery 1.9.1 + JQM 1.3.0-stable

javascript - 选中复选框时禁用表单字段

javascript - DynamoDB 查询包含来自 Node.js 数组的值之一

javascript - jQuery 插件中的事件委托(delegate)

javascript - 有没有办法绕过 Access-Control-Allow-Origin?

javascript - 如何使用 ASP.NET MVC 3/jQuery 实现即时搜索框?

javascript - 如何在通过 webpack 加载单个捆绑的 javascript 文件时显示进度条?