[英]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.