AJAX 触发远程脚本然后检查 success-response

AJAX trigger remote script then check for success-response

我一直在绞尽脑汁,但我似乎无法全神贯注于我找到的一点帮助。

我正在 运行 连接一个数据库,该数据库由来自另一个数据库的数据提供。 csv 传输由第三方服务器处理,该服务器提供可编译和传送数据的可执行文件 "flows"。

我有一个 php 脚本来处理请求(不能通过 Javascript 直接完成,因为缺少 'Access-Control-Allow-Origin' header)。但这 运行 很好。我可以触发流量。

但这不是问题所在。 我想做的是:用这样的东西触发按钮的@onClick 流:

function trigger_func(flowID) {
    $.ajax({
        url: './ajaxPHP_handler.php',
        data: "flowid="+flowID,
        dataType: 'json',
        success: function(result) {
            var jsonResult  =   jQuery.parseJSON(result);
            console.log(jsonResult.runID);
        }
    });
}

有了 flowID 和生成的 运行ID,我想每隔一秒左右检查一次。

function check_status(flowID, runID) {
    $.ajax({
        url: './ajaxPHP_handler.php',
        data: "flowid="+flowID+"&action=status&runId="+runID,
        dataType: 'json',
        success: function(result){...}
    });
}

这将 return 流程的状态/进度。 它会以 status==null 开始几秒钟,然后继续到 status=='running',最后是 status=='success'。 我已经从 check_status() 到 运行 了 15 次,在 trigger_func() 的 success-function 的 for 循环中使用 setTimeout 并且它也工作正常。 但是我终其一生都无法弄清楚如何 link 这些东西一起检查直到状态为 'success' 然后停止检查,更新页面内容等等......

我也摆弄过类似

的东西
trigger_func(id).done(function(result){
console.log(result);
});

这也有效,但在 'success' 之前,我仍然想不出进一步的方法来每秒检查一次。我想这归结为让变量 'status' 回到我的循环中,这样我就可以打破它。

也许有人知道网上某处的一个易于理解的例子...

ajax 是异步的,所以你必须通过一些第三方变量

来管理

喜欢值为 0 的 Init

var _status = 0

而不是在第一次调用时将其更改为 1

function trigger_func(flowID) {
 $.ajax({
     url: './ajaxPHP_handler.php',
     data: "flowid="+flowID,
     dataType: 'json',
     success: function(result) {
         var jsonResult  =   jQuery.parseJSON(result);
         console.log(jsonResult.runID);
          check_status(flowID, runID);
     }
 });
}



 function check_status(flowID, runID) {
 $.ajax({
     url: './ajaxPHP_handler.php',
     data: "flowid="+flowID+"&action=status&runId="+runID,
     dataType: 'json',
     success: function(result){
        //at end status=='success'.
          if(status=='success'){
              // end part 
           }else{// running 
               check_status(flowID, runID);
           }

          // clear timeout will stop that time interval after success  
     }
 });
 }

你可以这样做:

function periodically_check_status_until_success(flowID, runID) {
    setTimeout(function() {
        $.ajax({
            url: './ajaxPHP_handler.php',
            data: { flowid: flowID, action: status, runId: runID },
            dataType: 'json',
            success: function(result){
                 if (result != 'success') {
                     periodically_check_status_until_success(flowID, runID);
                 }
            }
        });
    }, 5000); // Five seconds
}

注意:您可以为 data 选项使用一个对象,而不是自己连接字符串。

所以继续调用它

var flowID, runID;
function trigger_func(flowID) {
  $.ajax({
    url: './ajaxPHP_handler.php',
    data: "flowid="+flowID,
    dataType: 'json',
    success: function(result) {
        var jsonResult  =   jQuery.parseJSON(result);
        runID= jsonResult.runID;
        check_status();
    }
  });
}

function check_status() {
  $.ajax({
    url: './ajaxPHP_handler.php',
    data: "flowid="+flowID+"&action=status&runId="+runID,
    dataType: 'json',
    success: function(result){
      if (result is not what you want) {
        setTimeout(check_status,1000);
      }
    }
  });
}