![](/img/trans.png)
[英]Jquery - $.When not trigger ajax on done menthod
[英]Why does my jQuery when().then() function trigger before the ajax request in when is done?
我需要設置一個異步回調,因為函數從遠程位置獲取內容。 我正在這樣做:
$.when( priv[box.view.renderWith](content, box.view.gadget_id) ).then(function(late) {
console.log("done");
console.log(late)
console.log($(content))
$(content).append(late).enhanceWithin();
});
與我的when
函數觸發單個Ajax請求。 在它的回調中,我返回一個元素追加到$(content)
。
我的問題是, then
函數會立即觸發,並且遠遠早於我的ajax回調運行並返回結果。
問題 :
不能將when()
與進行ajax請求的函數一起使用嗎? 我是否必須直接在when()
發出ajax請求? 還是為什么then()
觸發? 我該如何解決?
謝謝!
編輯:我當前的代碼段版本:
$.when( priv[box.view.renderWith](content, box.view.gadget_id) ).then(function(fragment) {
// DOM manip...
console.log("NOW WE ARE DONE WITH WHEN");
console.log(fragment)
$(content).append(fragment).enhanceWithin();
});
我正在調用的函數(沒有內容生成部分):
priv.constructListbox = function (element, internal) {
var no_data_body,
no_data_cell,
portable,
gadget_id = element.getAttribute("data-gadget-id") || internal,
settings = priv.gadget_properties[gadget_id],
portal_type = settings.portal_type_title,
// wrapper
$parent = $(element.parentNode);
if (settings !== undefined) {
// ASYNC > this will trigger an Ajax request
portable = priv.erp5.allDocs({
"query": "type: \"" + settings.datasource + "\"",
"limit": [0, (settings.configuration.pagination.items_per_page_select[0] || 30)],
"wildcard_character": "%",
"include_docs": true
}).always(function (answer) {
.... stuff ...
// finish
// return to calling function
if (internal) {
console.log("foo");
console.log("no we only give back a fragment");
return fragment_container;
}
$parent.empty().append( fragment_container ).enhanceWithin();
});
// if internal call, return the promise object
if (internal) {
console.log("foo internal, promise");
return portable;
}
} else {
// error handler
}
};
當我在then
回調中進行portable
控制台操作時,我得到了promise
對象,所以現在函數返回了promise與一個元素。 但是,解決后,我希望當我不……得到任何東西時得到我的fragment_container
:-(
希望足夠清楚。
我聽說過的最好建議是將Async編程視為普通函數,然后在最后添加promise。
我很難確定您要在哪里設置fragment_container,但是在這里。
priv.constructListbox = function (element, internal) {
var dfd = new $.Deferred();
...
if (settings !== undefined) {
portable = priv.erp5.allDocs({
"query": "type: \"" + settings.datasource + "\"",
"limit": [0, (settings.configuration.pagination.items_per_page_select[0] || 30)],
"wildcard_character": "%",
"include_docs": true
}).always(function (answer) {
.... stuff ...
// finish
// return to calling function
if (internal) {
console.log("foo");
console.log("no we only give back a fragment");
dfd.resolve({message:"You did it!", element: fragment_container });
}
$parent.empty().append( fragment_container ).enhanceWithin();
});
} else {
dfd.reject({result:"Nope - no data came out"});
// error handler
}
return dfd.promise();
};
那么很容易看到您返回的內容:
$.when( priv[box.view.renderWith](content, box.view.gadget_id) ).then(function(fragment) {
console.log("NOW WE ARE DONE WITH WHEN");
console.log(fragment);
},
function(fragment) {
console.log("It failed");
console.log(fragment);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.