你好我对这个论点很困惑:我知道在javascript函数中执行一个 有时是异步的方式,这是我的问题。我有一个名为
的函数function createPopupHour()
此函数创建一个html选择元素,它不会返回任何内容。我在请求的成功部分中在$ .AJAX请求中调用此函数。
$.ajax({
url:"responseregistrodocente.php",
data:{
operazione:'caricaAssenza',
idAssenza:id_array[3],
codiceFiscale: id_array[0],
data:id_array[1],
tipo:id_array[2]
},
type:"POST",
dataType:"json",
success: function (jsonObject) {
createPopupHourSelect()
//other code
});
},
error: function(error){
//XMLREQQUESTOBJECT
alert(error.responseText);
location.reload();
},
cache:false,
ifModified:false
});
问题是当我调用该函数时,其他代码并没有注意到我的函数结束了。我知道在jquery中有" deferred Object",也许我需要我的函数创建一个延迟对象,并将其返回给代码。但是sintax怎么样?还是有另一个更简单干燥的解决方案???
这是正确的吗?
function createPopupHour select(){ //staff to do
return $.deferred();//it's in pending state
}
和$ .ajax
$.ajax({
url:"responseregistrodocente.php",
data:{
operazione:'caricaAssenza',
idAssenza:id_array[3],
codiceFiscale: id_array[0],
data:id_array[1],
tipo:id_array[2]
},
type:"POST",
dataType:"json",
success: function (jsonObject) {
var defered=createPopupHourSelect()
defered.then(function{//other code])
defered.resolve();
});
},
error: function(error){
//XMLREQQUESTOBJECT
alert(error.responseText);
location.reload();
},
cache:false,
ifModified:false
});
答案 0 :(得分:1)
是的,other code
需要驻留在弹出事件完成时将执行的回调函数中,就像ajax完成时执行弹出启动代码一样。您可以使用原始回调,也可以使用功能更强大的promise模式。
function …() {
var def = $.Deferred();
// start asynchronous task
// when the task is done (in the future), call
def.resolve(…); // optionally with results
// and right now do
return def.promise();
}
由于$.ajax
确实也会返回一个承诺,您可以通过.then
使用链接(假设createPopUpHourSelect
符合上述模式):
$.ajax({
url:"responseregistrodocente.php",
data:{…},
type:"POST",
dataType:"json",
cache:false,
ifModified:false
})
.fail(function(error){
alert(error.responseText);
location.reload();
})
.then(createPopupHourSelect) // gets passed the parsed JSON
.then(function(result) { // gets passed the resolve arguments from the popup
// other code
});
如果您在其他代码中也需要ajax响应,并且不想通过弹出功能传递它,请使用
.then(function(json) {
return createPopupHourSelect(…)
.then(function(popupResults) {
// other code
});
}) /* returns a promise that resolves with result of other code
.then(…) */