2010-12-07 102 views
7

我如何获得从jquery ajax调用返回的数据。 $ .ajax()之外。

//Reloads the inital page 
function jobexist(jobname) 
{ 
    var dataString = 'jobname=' + jobname; 
    var found = false; 

    $.ajax(
    { 
     type: 'POST', 
     url: "/genode/jobs/jobexist.m", 
     data: dataString, 
     dataType: 'json', 
     success: function(data) 
     { 
     alert("Passed"); 
     if(data.result == 0) 
     { 
      found = true; 
      }else{ 
      found = false; 
      } 
     }, 
     error: function(data) 
     { 
     alert("Login Failed"); 
     return -1; //alert(data); 
     } 
    }); 

    if(found == true) 
    { 
     alert("found!")' 
     return true; 
    }else{ 
     alert("not found!"); 
     return false; 
    } 
} 



if(!jobexist(jobname)) 
{ 
    $("#jobname_error").text("This jobname already exist."); 
    $("#jobname_error").show(); 
    return false; 
} 

回答

2

Ajax以异步方式工作,所以如果找到的语句将在ajax调用完成之前命中。

你可以做的是从你的ajax成功函数中调用一个函数,并传递你想给它的任何数据

function found(data){ 

    if(data.result == 0) 
    { 
     alert("found!") 
     return true; 
    }else{ 
     alert("not found!"); 
     return false; 
    } 
} 

$.ajax(
    { 
     type: 'POST', 
     url: "/genode/jobs/jobexist.m", 
     data: dataString, 
     dataType: 'json', 
     success: function(data) 
     { 
     alert("Passed"); 
     found(data); 
     }, 
     error: function(data) 
     { 
     alert("Login Failed"); 
     return -1; //alert(data); 
     } 
    }); 
1

JavaScript是异步的,这意味着你要改变你的思维有点路,开始思想扭曲的旅程进入回调和封闭的奇怪世界。 您可以简单地在ajax调用范围外暴露一些变量,并为其分配数据,但这并不是您想要的。

你想要做的是:

  1. 定义一个回调函数:

     
    function afterAjax() { 
        $("#jobname_error").text("This jobname already exist."); 
        $("#jobname_error").show(); 
        return false; 
    }; 
    

  2. 重新定义你的函数负责AJAX接受callbackFn作为第二个参数:

     
    function jobexist(jobname, callbackFn) { 
    

  3. 执行ajax负责的函数时传递您的回调函数:

     
    jobexist(jobname, afterAjax) 
    

  4. 执行此回调时,时间是正确的:

     
    if(data.result == 0) { 
        callbackFn(); 
    }