2015-05-01 55 views
0

我一直在尋找我的大腦,但我似乎無法將我的頭圍繞我找到的小幫助。AJAX觸發器遠程腳本,然後檢查成功響應

我正在運行由另一個數據庫中的數據提供的數據庫。 csv傳輸由第三方服務器處理,該第三方服務器提供編譯和傳送數據的可執行「流」。

我有一個PHP腳本來處理請求(由於缺少'Access-Control-Allow-Origin'標頭,不能通過Javascript直接完成)。但這很好。我可以觸發流量。

雖然這不是問題。 我想要做什麼:觸發按鈕的流動@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); 
     } 
    }); 
} 

隨着流ID,並將所得的runid我想回來看看像每秒左右。

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

這將返回流的狀態/進度。 它會在status == null的狀態下啓動幾秒鐘,然後進入狀態=='運行',最後狀態=='成功'。 我已經得到了check_status()在trigger_func()的成功函數內的for循環中運行了15次,並且setTimeout也可以正常工作。 但我不能爲我的生活弄清楚如何將這些東西鏈接在一起,讓它檢查,直到狀態爲'成功',然後停止檢查,更新頁面內容等...

我也撥弄有點像

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

這樣做也可以,但我仍然想不到我的方式進一步檢查每一秒,直到'成功'。我想它歸結爲變量'狀態'回到我的循環,所以我可以打破它。

也許有人易於理解的例子都知道網上什麼地方...

+0

讓我明白了,基本上你想使一個週期性的AJAX請求,直到成功狀態返回,在這一點上,應立即停止。我對麼? – qwattash

+0

是的。這是我想要做的 –

回答

1

你可以這樣做:

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選項,而不是自己的字符串連接在一起。

+0

我認爲我得到了這樣的運行。 :) 天哪,這是如此容易....非常感謝在思考過程中的一腳:) 我將超時設置爲1000,所以第一次運行check_status()時的延遲無關緊要。流量在頭幾秒內始終處於「未決」狀態。 也感謝其他評論者。這真的是一個很棒的社區,當我需要查看想法時,它已經成爲我的頭號資源...... :) –

0

阿賈克斯異步,所以你必須通過一些第三方的變量通過這個管理

像初始化值爲0

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 
    } 
}); 
} 
+0

切勿在ajax調用之外使用setTimeout。使用成功回調觸發下一輪 – mplungjan

+0

肯定是正確的,但這就是爲什麼我建議,如果條件... –

+0

@mplungjan請看看更新後的答案.. –

0

所以還是叫它

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); 
     } 
    } 
    }); 
}