簡體   English   中英

答應和延誤在jQuery中不工作

[英]promise and deffered not working in jquery

我試圖在異步調用之后調用一個函數,但是在異步調用函數之后正常的函數不會觸發,我不確定是什么使它停止運行,請幫助我弄清楚它。我正在嘗試學習延遲和承諾的概念,不知道我在想什么。 小提琴

$(document).ready(function(e) {
     var form_data = $(this).serialize();
        var form_url = $(this).attr("action");
        var form_method = $(this).attr("method").toUpperCase();

    $("form[ajax=true]").submit(function(e) {
         e.preventDefault();
        $("#loadingimg").show();
        var promise = ajaxcall_function();
        promise.then(somes1());



    });

});
function somes1(){
   alert("dd");
}
function ajaxcall_function(){
    var deferred = $.Deferred();
      $.ajax({
            url: form_url, 
            type: form_method,      
            data: form_data,     
            cache: false,
            success: function(returnhtml){                          
                $("#result").html(returnhtml); 
                $("#loadingimg").hide();       
                 deferred.resolve();
            }           
        });    
     return deferred.promise();
}

您需要使用此:

 promise.then(somes1);

代替:

 promise.then(somes1());

您執行此操作的方式是立即調用該函數,並將返回結果傳遞給.then() 那顯然不是您想要的。 相反,您只想傳遞一個函數引用(只是函數名稱而不帶括號),以便以后可以調用它。 在函數名稱的末尾添加() ,意味着立即調用它。

您還可以像這樣簡化ajax函數,以使用已經從$.ajax()返回的$.ajax()而不是創建自己的$.ajax()

function ajaxcall_function(){
      return $.ajax({
            url: form_url, 
            type: form_method,      
            data: form_data,     
            cache: false
        }).then(function(returnhtml) {                          
              $("#result").html(returnhtml); 
              $("#loadingimg").hide();
              return returnhtml;
        });    

}

ajaxcall_function().then(function(data) {
    // code here
});

如果您需要包裝紙,可以這樣嘗試:

function ajaxcall_function(form){
    var form_data = $(form).serialize();
    var form_url = $(form).attr("action");
    var form_method = $(form).attr("method").toUpperCase();

    var deferred = $.Deferred();
      $.ajax({
            url: form_url, 
            type: form_method,      
            data: form_data,     
            cache: false,
            success: function(returnhtml){                          
                $("#result").html(returnhtml); 
                $("#loadingimg").hide();       
                 deferred.resolve.apply(this, arguments);
            }           
        });
     // Make other things here    
     return deferred.promise();
}

 ajaxcall_function()
 .done(function(returnhtml){
     // do something here with returnhtml
     // note the 'this' - scope is different because of .apply(this, arguments)
 })

這是重構的小提琴。 http://jsfiddle.net/8a3mwkfp/4/

但是要考慮到包裝器必須有意義,否則應將$.ajax返回結果用作promise

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM