2011-01-30 147 views
1

我有一個JavaScript函數,它使用jQuery對Web服務進行JSON調用。 在成功函數中,我需要評估JSON響應,並在必要時在同一個Web服務中調用另一種方法。函數調用ajax返回false

這是我如何做到這一點:

function firstAjaxCall(aid, tid) { 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method1", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (response) { 
      var respData = response.d; 
      //do some stuff 
      if (respData.HasEnded == true) { 
       clearInterval(tid); 
       var end = false; 
       end = endFunction(aid); 
       if (end) { 
        // do some other stuff 
       } 
      } 
     }, 
     failure: function (errorMsg) { alert(errorMsg.toString()); } 
    }); 
} 

並正在從阿賈克斯成功函數中調用的endfunction這樣:

function endFunction(aid) { 
    var hasEnded = false; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method2", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (callbackData) { 
      var endRespData = callbackData.d; 
      hasEnded = endRespData.Success; 
      alert(hasEnded.toString()); 
     }, 
     failure: function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log(textStatus, errorThrown); 
     } 
    }); 
    return hasEnded; 
} 

這裏是怪異的東西。阿賈克斯呼籲做得很好。服務器上的代碼按計劃運行。但是,如果我嘗試在endFunction(aid)的成功函數中設置一個螢火蟲斷點,則不會命中,但會顯示警告框,顯示單詞true。這有點好,因爲我們似乎確實達到了成功的功能。然而,hasEnded變量從未設置爲true,因此它總是返回false。 從Firebug控制檯調用endFunction(1)將顯示一個警告框,其中包含單詞true,並返回值false

怎麼回事?

回答

0

http://api.jquery.com/jQuery.ajax/ 它看起來像你的文檔中使用「失敗」你有「錯誤」: 錯誤(XMLHttpRequest參數url errorThrown) 也應該做這樣的事情:

function firstAjaxCall(aid, tid) { 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method1", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (response) { 
      var respData = response.d; 
      //do some stuff 
      if (respData.HasEnded == true) { 
       clearInterval(tid); 
       var end = false; 
       endFunction(aid,function(endv){ 
        if (endv) { 
        // do some other stuff 
        } 
       }); 
      } 
     }, 
     error: function (errorMsg) { alert(errorMsg.toString()); } 
    }); 
} 

function endFunction(aid,endcallback) { 
    var hasEnded = false; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method2", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (callbackData) { 
      var endRespData = callbackData.d; 
      hasEnded = endRespData.Success; 
      alert(hasEnded.toString()); 
      endcallback(hasEnded); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log(textStatus, errorThrown); 
      endcallback("?"); 
     } 
    }); 
    //return hasEnded; 
} 
+0

謝謝爲答案! 試過上面的代碼,但是當我運行firstAjaxCall時,我得到「endcallback不是函數」。我想我需要更多關於這個回調事件的指導...... – 2011-02-01 19:16:40

2

AJAX是異步$.ajax調用不會等待服務器回覆。

因此,return hasEnded;行在AJAX回調之前運行。

您需要讓您的endFunction採取回調參數,如$.ajax那樣。