【问题标题】:Returning from a nested function in javascript从javascript中的嵌套函数返回
【发布时间】:2011-03-31 14:47:45
【问题描述】:

我正在尝试创建一个使用 jquery 的 ajaxfunction 从我的 ajax.php 文件中获取一些信息的函数。

代码:

function ajaxIt(dataLine){
    $.ajax({
        type: "POST",
        url: "ajax.php",
        data: "ajax=true&"+dataLine,
        success: function(msg){
            console.log("[AjaxIt]: "+dataLine+" returned "+msg);
            return msg;
        }
    });
 }
 if(ajaxIt("action=loggedIn")=="1"){
       console.log("Logged In");
       loggedIn=true;
       initiate2();
 }

问题是我无法让success函数一路返回到ajaxIt函数。谁能解释一下我是如何做这样的事情的?

谢谢。

【问题讨论】:

    标签: javascript jquery function return nested-function


    【解决方案1】:

    $.ajax 是异步的。这意味着它将立即返回,而不是等待 AJAX 查询执行并从服务器检索结果。当来自服务器的消息到达时,您的 ajaxIt 函数已经完成工作。

    你应该在这里使用的是延续传递风格。为ajaxIt 提供一个延续:一个解释ajaxIt 完成工作后应该做什么的函数。

    function ajaxIt(data, continuation) {
      data.ajax = true;
      $.post("ajax;php", data, function(msg) {
        console.log("[AjaxIt]: returned "+msg);
        continuation(msg);
      }); 
    }
    
    ajaxIt({action:"logged-in"}, function(result) {
      if (result == "1") {
        console.log("Logged In");
        loggedIn=true;
        initiate2();
      }
    });
    

    【讨论】:

    • 继续?回调是一个更标准的名称。我们挂断电话,有空再给您回电。
    【解决方案2】:

    您需要调用 callback 函数以这种方式处理数据:

    function ajaxIt(dataLine, cb){
        $.ajax({
            type: "POST",
            url: "ajax.php",
            data: "ajax=true&"+dataLine,
            success: function(msg){                
                if($.isFunction(cb))
                   cb.apply(null, [msg]);
            }
        });
    }
    
    ajaxIt("action=loggedIn", function(data){
          if(data === "1"){
             console.log("Logged In");
             loggedIn=true;
             initiate2();
          }
    });
    

    【讨论】:

    • 这行得通,谢谢。它的代码比我希望的要多一些(几乎和每次都编写 ajax 函数一样多),但它必须这样做。感谢您的快速响应。
    • @Thomas,实际上,它只是多一点代码?就几个字。不检查函数,就像是微不足道的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2015-08-01
    • 2015-03-15
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多