在 jquery $.when(ajax).done(function(){do sth} 中,我如何回调同一个回调函数两次?
in jquery $.when(ajax).done(function(){do sth}, how can i callback twice to the same callback function?
在jquery中我有以下代码:
A 部分:
$.when(result = $.startAsyncRequest(arg)).done(function(){
console.log(result); // this should be called every time something is returned
if (result.hasOwnProperty("responseJSON")){
console.log("build frontend table using completed task");
}
});
B 部分:
jQuery.extend({
startAsyncRequest: function(arg){
console.log(arg);
$.when(result = makeAjaxRequest(arg)).done(function(){
var taskid = result.taskid;
var taskurl = "someurl" + taskid;
startProgressBar(taskurl, {
onSuccess: function(){
$.when(result2 = makeAjaxRequest(taskid)).done(function(){
console.log("received completed task");
return result2;
});
});
return "starting progress bar";
});
return "started task";
}
});
A 部分启动一个函数(B 部分),其中包含多个 ajax post 请求,所有请求均被延迟。这些请求之一是基于进度条完成后的回调发出的。
每次 startAsyncRequest returns,我希望它 return 到 A 部分并将结果记录到控制台。所以我希望它 return 有几次,但它只有 return 一次(第一个请求,"started task")。
有办法吗?
我不想将 startAsyncRequest 分解成多个函数,因为 A 部分在我的代码中重复了很多次,我希望它将所有任务调用、进度条和任务检索逻辑包装在一个功能。
检查这个:https://api.jquery.com/category/deferred-object/
function wrap(ajaxRequest){
var defer = $.Deferred();
ajaxRequest.done(function(resp){
defer.notify({ "message" : "Done Success", resp : resp })
}).fail(function(resp){
defer.notify({ "message" : "Error Failure", resp : resp });
});
setTimeout(function(){
defer.notify({ "message" : "Request is made", resp : null });
})
return defer.promise();
}
/// Calling function
wrap($.ajax({
// params
})).progress(function(obj){
console.log(obj)
})
解决方案是-
A 部分:
$.startAsyncRequest(arg, function(result){
console.log(result); // this should be called every time something is returned
if (result.hasOwnProperty("responseJSON")){
console.log("build frontend table using completed task");
}
});
B 部分:
jQuery.extend({
startAsyncRequest: function(arg, callbackFct){
console.log(arg);
$.when(result = makeAjaxRequest(arg)).done(function(){
var taskid = result.taskid;
var taskurl = "someurl" + taskid;
startProgressBar(taskurl, {
onSuccess: function(){
$.when(result2 = makeAjaxRequest(taskid)).done(function(){
console.log("received completed task");
callbackFct(result2);
});
});
return callbackFct("starting progress bar");
});
return callbackFct("started task");
}
});
在jquery中我有以下代码:
A 部分:
$.when(result = $.startAsyncRequest(arg)).done(function(){
console.log(result); // this should be called every time something is returned
if (result.hasOwnProperty("responseJSON")){
console.log("build frontend table using completed task");
}
});
B 部分:
jQuery.extend({
startAsyncRequest: function(arg){
console.log(arg);
$.when(result = makeAjaxRequest(arg)).done(function(){
var taskid = result.taskid;
var taskurl = "someurl" + taskid;
startProgressBar(taskurl, {
onSuccess: function(){
$.when(result2 = makeAjaxRequest(taskid)).done(function(){
console.log("received completed task");
return result2;
});
});
return "starting progress bar";
});
return "started task";
}
});
A 部分启动一个函数(B 部分),其中包含多个 ajax post 请求,所有请求均被延迟。这些请求之一是基于进度条完成后的回调发出的。
每次 startAsyncRequest returns,我希望它 return 到 A 部分并将结果记录到控制台。所以我希望它 return 有几次,但它只有 return 一次(第一个请求,"started task")。
有办法吗?
我不想将 startAsyncRequest 分解成多个函数,因为 A 部分在我的代码中重复了很多次,我希望它将所有任务调用、进度条和任务检索逻辑包装在一个功能。
检查这个:https://api.jquery.com/category/deferred-object/
function wrap(ajaxRequest){
var defer = $.Deferred();
ajaxRequest.done(function(resp){
defer.notify({ "message" : "Done Success", resp : resp })
}).fail(function(resp){
defer.notify({ "message" : "Error Failure", resp : resp });
});
setTimeout(function(){
defer.notify({ "message" : "Request is made", resp : null });
})
return defer.promise();
}
/// Calling function
wrap($.ajax({
// params
})).progress(function(obj){
console.log(obj)
})
解决方案是-
A 部分:
$.startAsyncRequest(arg, function(result){
console.log(result); // this should be called every time something is returned
if (result.hasOwnProperty("responseJSON")){
console.log("build frontend table using completed task");
}
});
B 部分:
jQuery.extend({
startAsyncRequest: function(arg, callbackFct){
console.log(arg);
$.when(result = makeAjaxRequest(arg)).done(function(){
var taskid = result.taskid;
var taskurl = "someurl" + taskid;
startProgressBar(taskurl, {
onSuccess: function(){
$.when(result2 = makeAjaxRequest(taskid)).done(function(){
console.log("received completed task");
callbackFct(result2);
});
});
return callbackFct("starting progress bar");
});
return callbackFct("started task");
}
});