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

Ric*_*ard 3 javascript jquery

可能重复:在它之外使用ajax respone是否可行

我创建了以下JavaScript例程,该例程转到WCF oData服务并获取一些数据.在success元素中,我将结果输入结果变量并提醒它们 - 我看到有返回的对象.当我在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;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

最初我没有async:false参加ajax电话会议.我现在已添加,但它无法解决问题.

fre*_*ish 6

ajax调用是异步操作.它会触发,你的代码也不会停止.因此,results返回其在这一点上是不确定的.您需要做的是将回调传递给函数.

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

现在你像这样使用它

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

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

编辑

我错过了请求是JSONP.在这种情况下async: false甚至不起作用(它不适用于跨域请求和JSONP).所以你必须使用回调.


Ric*_*ard 5

理查德!

这不是范围问题,而是更多的执行问题.无论是successerror选项是事件处理程序和异步运行(因此它被称为AJAX).这实质上意味着在触发或触发事件之前alert(results),return results可以并且可能会执行.successerror