Javascript AJAX请求-添加额外的GET请求内部循环

Javascript AJAX请求-添加额外的GET请求内部循环,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在表格顶部有一个按钮,显示一个启动VOIP呼叫的模式窗口-最终目的是让它呼叫列表中的第一个号码,然后是第二个号码,依此类推。我已经让它工作,因为它显示模式窗口,并允许我发起呼叫列表中的第一个号码 我现在需要更新脚本,这样如果调用成功,它就会在循环中发出另一个AJAX请求,比如每5秒检查一次调用的状态。如果第一次调用成功,它将返回我存储在httpResponseText变量中的以下内容: Authentication accepted<br/>ActionID = Jo9oACY52

我在表格顶部有一个按钮,显示一个启动VOIP呼叫的模式窗口-最终目的是让它呼叫列表中的第一个号码,然后是第二个号码,依此类推。我已经让它工作,因为它显示模式窗口,并允许我发起呼叫列表中的第一个号码

我现在需要更新脚本,这样如果调用成功,它就会在循环中发出另一个AJAX请求,比如每5秒检查一次调用的状态。如果第一次调用成功,它将返回我存储在
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();