Javascript AJAX请求-添加额外的GET请求内部循环
我在表格顶部有一个按钮,显示一个启动VOIP呼叫的模式窗口-最终目的是让它呼叫列表中的第一个号码,然后是第二个号码,依此类推。我已经让它工作,因为它显示模式窗口,并允许我发起呼叫列表中的第一个号码 我现在需要更新脚本,这样如果调用成功,它就会在循环中发出另一个AJAX请求,比如每5秒检查一次调用的状态。如果第一次调用成功,它将返回我存储在Javascript AJAX请求-添加额外的GET请求内部循环,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在表格顶部有一个按钮,显示一个启动VOIP呼叫的模式窗口-最终目的是让它呼叫列表中的第一个号码,然后是第二个号码,依此类推。我已经让它工作,因为它显示模式窗口,并允许我发起呼叫列表中的第一个号码 我现在需要更新脚本,这样如果调用成功,它就会在循环中发出另一个AJAX请求,比如每5秒检查一次调用的状态。如果第一次调用成功,它将返回我存储在httpResponseText变量中的以下内容: Authentication accepted<br/>ActionID = Jo9oACY52
httpResponseText
变量中的以下内容:
Authentication accepted<br/>ActionID = Jo9oACY52cp1
此请求返回3个值—ActionID、UID、STATUS—如下所示:
xshsJ6Y2eLDC,1500806656.160,ANSWER
我只对第三个值(STATUS)感兴趣,我需要不断检查此请求的结果,直到STATUS不等于in_PROGRESS
。在这一点上,我可以启用下一个呼叫按钮,然后重新开始
以下是我当前的表和脚本:
$(“#开始bulkcontactcall”)。单击(函数(){
$(this.attr('selectedRow','1');
contactMobile=$($($($('table>tbody>tr:nth child(1)>td:nth child(2)).children()[0]).attr('contactMobile');
contactName=$($($('table>tbody>tr:nth child(1)>td:nth child(2)).children()[0]).attr('contactName');
$('callNextBulkContact').prop('disabled',true);
firstURL=“”+defaultCallBackNumber+“”+contactMobile;
log('firstURL:'+firstURL);
$.ajax({
url:“+defaultCallBackNumber+”+contactMobile,
数据:{},
键入:“获取”
})
.then(功能(数据、状态、xhr){
var httpStatus=状态;
var httpResponseCode=(xhr.status);
var httpResponseText=(xhr.responseText);
$('#ajaxSuccessBulk').html('Call in Progress').show();
$(“#startBulkContactCall”).prop(“disabled”,true);
$(“callNextBulkContact”).prop(“disabled”,true);
})
.失败(功能(xhr){
var httpStatus=(xhr.status);
var httpResponseCode=(xhr.getAllResponseHeaders);
var httpResponseText=(xhr.responseText);
var ajaxError='请求回拨时出错。HTTP状态:'+httpStatus+''+httpResponseText;
//使警报可见
$('#ajaxError').html(ajaxError.show();
})
});
$('#callNextBulkContact')。单击(函数(){
$('callBulkContact').attr('selectedRow',parseInt($('callBulkContact').attr('selectedRow'))+1;
var rowNum=parseInt($('callBulkContact').attr('selectedRow');
var row='table>tbody>tr:n个孩子('+rowNum+')>td:n个孩子(2)';
contactMobile=$($($(行).children())[0]).attr('contactMobile');
contactName=$($($(行).children())[0]).attr('contactName');
});代码>
批量呼叫
名称
可移动的
&时代;接近
呼叫联系人
召唤
错误响应
正在通话
接近
开始通话
下一个
我要做的是:首先在函数中单独编写代码,这样会使事情更容易理解
startCall应该启动您的调用,它接收ajax应该使用的callURL。它会返回一个承诺,一旦做出承诺就会得到解决
monitorCall接受callID,并在内部使用回调(第三个参数“failed_Trys”),它将使用ajax启动状态检查,并每5秒调用一次自身,直到出现连续5次失败,或者直到我们获得正确的状态。回调是一个常见的JS回调,错误和结果作为参数
getMonitoredCall将前两个函数连接在一起,以给出一个承诺,该承诺将在调用结束后解决
getNewCallUrl用于提供另一个调用。此函数将在每次调用之前调用,以检索要调用的用户。那里还有工作要做!它应该返回一个承诺,给出URL作为结果
最后,loopCalls会启动所有操作,一旦一个调用完成,它会再次调用自身以跟进下一个调用,直到出现故障
function startCall(callURL){
return $.ajax({
url: callURL,
data: {},
type: "GET"
}).then(function(data, status, xhr) {
var httpStatus = status;
var httpResponseCode = (xhr.status);
var httpResponseText = (xhr.responseText);
$('#ajaxSuccessBulk').html('Call in Progress').show();
$("#startBulkContactCall").prop("disabled", true);
$("#callNextBulkContact").prop("disabled", true);
return Promise.resolve(xhr.responseText.match(/ActionID = (.+)/)[1]);
})
.fail(function(xhr) {
var httpStatus = (xhr.status);
var httpResponseCode = (xhr.getAllResponseHeaders);
var httpResponseText = (xhr.responseText);
var ajaxError = 'There was an error requesting the call back. HTTP Status: ' + httpStatus + ' ' + httpResponseText;
//make alert visible
$('#ajaxError').html(ajaxError).show();
});
}
function monitorCall(callID,callback,failed_tries){
failed_tries = failed_tries || 0;
$.ajax({
url: 'https://www.acme.com/GetStatus.php',
data: {ActionID:callID},
type: "GET"
}).then(function(data){
if(data && data.split(',')[2] != "IN_PROGRESS"){
callback(null,data);
}else{
setTimeout(monitorCall.bind(null,callID,callback,0),5000);
}
}).fail(function(xhr){
failed_tries++;
if(failed_tries>5){
callback("Error trying to get the status, stopping after 5 consecutive tries.");
}else{
setTimeout(monitorCall.bind(null,callID,callback,failed_tries),5000);
}
});
}
function getMonitoredCall(callUrl){
return new Promise(function(resolve,reject){
startCall(callUrl).then(function(callID){
monitorCall(callID,function(err,res){
if(err){
reject(err);
}else{
resolve(res);
}
});
});
});
}
function getNewCallUrl(){
return $.ajax({
url: "http://getNewCallUrl/",
data: {},
type: "GET"
}).then(function(data, status, xhr) {
//Let's presume the request simply returns a call URL.
return Promise.resolve(data);
})
.fail(function(xhr) {
var httpStatus = (xhr.status);
var httpResponseCode = (xhr.getAllResponseHeaders);
var httpResponseText = (xhr.responseText);
var ajaxError = 'There was an error requesting the call back. HTTP Status: ' + httpStatus + ' ' + httpResponseText;
//make alert visible
$('#ajaxError').html(ajaxError).show();
});
}
function loopCalls(){
getNewCallUrl().then(function(callUrl){
return getMonitoredCall(callUrl);
}).then(function(){setTimeout(loopCalls,5000)});
}
loopCalls();
如何获取电话号码?电话号码从数据库查询返回,然后显示在HTML表中。您可能需要更正loopCalls()第一行的代码。
GetNewCallerl
在您调用之前不会返回承诺。它应该替换为getNewCallerl(),然后(…)代码>。我只是将其加载到我的站点中进行测试,并在这一行中得到一个错误。}。然后(function(){setTimeout(loopCalls,5000));
-控制台中的错误是“意外标记”)”
谢谢@Salketer-我现在正试图将这一切联系在一起,这样当用户单击批量调用按钮时,它会显示模式对话框,当他们单击开始调用按钮时,它会启动第一个调用。我在这里设置了一个JSFIDLE:我不确定如何将开始调用按钮联系起来ApprioPrivate函数-你能看看这个吗?你需要调用loopCalls来启动批量调用。你还需要在我的脚本末尾删除它的调用(它在那里显示它的工作原理)。然后您需要填充getNewCallUrl函数的内部,该函数应该执行任何需要的操作,以获取用于调用的URL,并返回与该URL解析的承诺。
function startCall(callURL){
return $.ajax({
url: callURL,
data: {},
type: "GET"
}).then(function(data, status, xhr) {
var httpStatus = status;
var httpResponseCode = (xhr.status);
var httpResponseText = (xhr.responseText);
$('#ajaxSuccessBulk').html('Call in Progress').show();
$("#startBulkContactCall").prop("disabled", true);
$("#callNextBulkContact").prop("disabled", true);
return Promise.resolve(xhr.responseText.match(/ActionID = (.+)/)[1]);
})
.fail(function(xhr) {
var httpStatus = (xhr.status);
var httpResponseCode = (xhr.getAllResponseHeaders);
var httpResponseText = (xhr.responseText);
var ajaxError = 'There was an error requesting the call back. HTTP Status: ' + httpStatus + ' ' + httpResponseText;
//make alert visible
$('#ajaxError').html(ajaxError).show();
});
}
function monitorCall(callID,callback,failed_tries){
failed_tries = failed_tries || 0;
$.ajax({
url: 'https://www.acme.com/GetStatus.php',
data: {ActionID:callID},
type: "GET"
}).then(function(data){
if(data && data.split(',')[2] != "IN_PROGRESS"){
callback(null,data);
}else{
setTimeout(monitorCall.bind(null,callID,callback,0),5000);
}
}).fail(function(xhr){
failed_tries++;
if(failed_tries>5){
callback("Error trying to get the status, stopping after 5 consecutive tries.");
}else{
setTimeout(monitorCall.bind(null,callID,callback,failed_tries),5000);
}
});
}
function getMonitoredCall(callUrl){
return new Promise(function(resolve,reject){
startCall(callUrl).then(function(callID){
monitorCall(callID,function(err,res){
if(err){
reject(err);
}else{
resolve(res);
}
});
});
});
}
function getNewCallUrl(){
return $.ajax({
url: "http://getNewCallUrl/",
data: {},
type: "GET"
}).then(function(data, status, xhr) {
//Let's presume the request simply returns a call URL.
return Promise.resolve(data);
})
.fail(function(xhr) {
var httpStatus = (xhr.status);
var httpResponseCode = (xhr.getAllResponseHeaders);
var httpResponseText = (xhr.responseText);
var ajaxError = 'There was an error requesting the call back. HTTP Status: ' + httpStatus + ' ' + httpResponseText;
//make alert visible
$('#ajaxError').html(ajaxError).show();
});
}
function loopCalls(){
getNewCallUrl().then(function(callUrl){
return getMonitoredCall(callUrl);
}).then(function(){setTimeout(loopCalls,5000)});
}
loopCalls();