鍍金池/ 問答/HTML/ 對于一個(gè)api,前臺有若干id,每次請求這個(gè)api,并判斷:api返回true,

對于一個(gè)api,前臺有若干id,每次請求這個(gè)api,并判斷:api返回true,則成功并請求下一個(gè);

對于一個(gè)后臺的api(query_status?id=1),前臺有若干個(gè)id(ids=[1,2,3,4,5]),每次js取出一個(gè)id,并請求這個(gè)api,獲取當(dāng)前的狀態(tài),然后進(jìn)入判斷:1、api返回的status為true,則標(biāo)記為成功并請求下一個(gè)id;2、api在15s內(nèi)沒有返回,則標(biāo)記為超時(shí)并請求下一個(gè)。 每次只請求一個(gè)id,而且當(dāng)上一個(gè)id請求完成之后再處理下一個(gè)。

目前我后臺是用tornado寫的,當(dāng)前的代碼嘗試了用js去輪詢,不過會阻塞前端頁面

我的目的:1、如果getconfirm獲取到的api的flag為true 則標(biāo)記此為通過,并處理下一個(gè),否則如果10s內(nèi)都獲取得到的api的flag為false,則標(biāo)記為超時(shí),并處理下一個(gè)

菜鳥代碼很渣,貼出關(guān)鍵邏輯求大佬指點(diǎn)


function wait_for_resp(vid){
  //cflag = getconfirm(vid);
  for (let i=0;i<5;i++)
  {
    sleep(2000);//sleep 3s;
    cflag = 0;
    cflag = getconfirm(vid);//這里的目的是 1、如果getconfirm獲取到的api的flag為true 則標(biāo)記此為通過,并處理下一個(gè),否則如果10s內(nèi)都獲取得到的api的flag為false,則標(biāo)記為超時(shí),并處理下一個(gè)
    if(cflag==1){//confirm=1 pass
      return 1;
      break;
    }
  }
  return 2; //timeout 15s
}

function main(){
 for(let i=0;i<ar1.length;i++){
        if (i==0){
          runurl(ar1[i]);//runurl如果通過 則會給后臺對應(yīng)到這個(gè)vid=ar1[i]的confirm flag設(shè)置為true 否則默認(rèn)為false
          console.log('1st runned!');
        }
        else
        { 
          wflag = 0;
          wflag = wait_for_resp(ar1[i-1]);
          console.log('wflag:   '+wflag);
          if (wflag==1){ //run next when the ar1[i-1] pass or timeout
            document.getElementById(ar1[i-1]).setAttribute('class', 'testpagesuccess');
            console.log('now set'+ar1[i-1]+'and running  :'+ar1[i]);
            runurl(ar1[i]);
          }
          else if(wflag==2){
            console.log('timeout');
            document.getElementById(ar1[i-1]).setAttribute('class', 'testpagefail');
            runurl(ar1[i]);
          }
        }}
回答
編輯回答
不討喜

去搜Promise。

另外吐槽一下

sleep(2000);//sleep 3s

2018年8月9日 20:13