【问题标题】:jQuery Ajax results in undefinedjQuery Ajax 导致未定义
【发布时间】:2011-11-09 09:08:09
【问题描述】:

我有一个简单的函数,它只将翻译后的消息从服务器返回到客户端。但是当我将结果传递给 var 时,结果显示未定义。

function MessageNoResult() {
  $.ajax(
  {
    type: "POST",
    async: true,
    url: '<%= ResolveUrl("~/WebMethods.aspx/MessageNoResult") %>',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
      return msg.d;
    }
  });
}

结果 --> 未定义(错误)

var message = MessageNoResult();
alert(message); 

当我查看标题时,它给了我:

Server  ASP.NET Development Server/9.0.0.0
Date    Wed, 09 Nov 2011 09:01:31 GMT
X-AspNet-Version    2.0.50727
Cache-Control   private, max-age=0
Content-Type    application/json; charset=utf-8
Content-Length  24
Connection  Close

Response {"d":"No search result"}
JSON d "No search result"

为什么我仍然得到未定义的结果?

【问题讨论】:

  • 您正试图从回调函数返回。其中一种方法是在 success 块中响应您的代码
  • 当您在success: function(msg) 中输入console.dir(msg) 时,控制台会说什么?
  • 当我将代码放入成功块时,它运行良好。我试图让代码更可重用。
  • 在这种情况下,您需要将处理 ajax 响应的逻辑放在它自己的函数中,并从您的成功处理程序中调用它 - 请参阅我和 AndreasAL 的答案以了解如何执行此操作。

标签: jquery ajax undefined webmethod


【解决方案1】:

您可以将回调函数传递给MessageNoResult 函数

function MessageNoResult(callback) {
  $.ajax(
  {
    type: "POST",
    async: true,
    url: '<%= ResolveUrl("~/WebMethods.aspx/MessageNoResult") %>',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
      callback(msg);
    }
  });
}

然后调用:

MessageNoResult(function(msg) {
    alert(msg.d);
});

【讨论】:

    【解决方案2】:

    当您的代码移至alert(message) 行时,ajax 调用仍在执行,因此message 变量没有值。

    您需要将响应的值传递给success 方法中的函数。

    success: function(msg) {
      myFunction(msg.d);
    }
    
    // outside ajax call
    function myFunction(ajaxValue) {
        alert(ajaxValue)
    }
    

    【讨论】:

    • 没有办法专门设置变量,因为您仍然会遇到同样的问题,即在您的 ajax 完全执行之前流程将继续。如果您不想将代码放在 success 方法中,那么您唯一真正的选择是将其传递给另一个函数 - 已修改示例。
    • 通过回调扩展了 Rory McCrossan 的答案:stackoverflow.com/questions/8062574/…
    【解决方案3】:

    ajax 调用是异步调用,并且您在 MessageNoResult 之后立即运行警报,因此在您实际完成 ajax 请求之前,该消息没有任何价值。

    您需要在成功的 ajax 调用中运行警报。

    【讨论】:

      【解决方案4】:

      您正试图从成功返回,这是一个回调函数。设置一个全局变量并在成功函数retmess = msg.d中使用它来存储返回或设置html元素的内容jQuery('#status').html(msg);

      【讨论】:

      • 这会给您带来一个问题,即您不知道retmess 的值何时被设置,因此您不知道何时可以使用它。
      【解决方案5】:

      您的代码:

      var message = MessageNoResult();
      

      message 变量设置为MessageNoResult 函数的返回值。由于您在此函数中没有返回值,因此您会得到 undefined 作为响应。

      处理此问题的正确方法是在 success 回调中处理来自 Ajax 调用的返回值。

      对于类似的问题,请参阅我的回答here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多