2017-12-01 12 views
0

jquery ajaxが次の約束事に進む前に終了するのを待つjavascriptの約束をどのように使用するのですか?次の約束事に進む前にjquery ajaxが終了するのを待つjavascriptの約束をどのように使用するのですか?

bookmakers = [ 
       "bet365","skybet","ladbrokes","williamhill","betfred","paddypower","sportingbet","betvictor","unibet","totesport","coral","boylesports","betstars","blacktype","betfair","betway","betbright","32red","10bet","marathonbet","118bet","888sport","stanjames","winner" 
      ]; 

function doSomethingAsync(value, dabookie) { 
    return new Promise((resolve) => { 
    setTimeout(() => { 
     /////////////////// 
     console.log("get ajax for "+dabookie); 
     tasking = ""; 
     dataString = ""; 

     $.ajax({ 
     type: "POST", 
     url: "testscraperules.php?task="+dabookie, 
     data: dataString, 
     cache: false, 
     timeout: 6000, 
     statusCode: { 
      404: function() { 
       //alert("Error 404"); 
       $("."+dabookie+" td").addClass("yellowback"); 
       $("."+dabookie+" .loading").replaceWith("<img src='cross.png' width='24' height='24' />"); 
      }, 
      503: function(){ // Service Unavailable (server access throttling) 
       $("."+dabookie+" td").addClass("magentaback"); 
       $("."+dabookie+" .loading").replaceWith("<img src='cross.png' width='24' height='24' />"); 
       //alert("Error 504 Gateway Timeout when accessing \n testscraperules.php?task="+dabookie); 
      }, 
      504: function(){ // Gateway Timeout 
       $("."+dabookie+" td").addClass("purpleback"); 
       $("."+dabookie+" .loading").replaceWith("<img src='cross.png' width='24' height='24' />"); 
       //alert("Error 504 Gateway Timeout when accessing \n testscraperules.php?task="+dabookie); 
      } 
     }, success: function(html){ 

      // alert("bookmaker in success is \n"+dabookie); 

      var jsonstring = $(html).filter("textarea").val(); //alert(jsonstring); 
      if(jsonstring == ""){ 
       $("."+dabookie+" td").addClass("amberback"); 
       $("."+dabookie+" .loading").replaceWith("<img src='cross.png' width='24' height='24' />"); 
      } 
      jsonstring = "{ \""+dabookie+"\": [ "+jsonstring+" ] }"; //for multiple results 6 horses x 25 bookmakers 

      console.log(jsonstring); 

     }, error: function(XMLHttpRequest, status, message){ 
     } 
     }); 

     ////// 
     console.log("Resolvingx " + dabookie); 
     resolve(value); 
    }, Math.floor(Math.random() * 1000)); 
    }); 
} 

    function test() { 
     let i; 
     let promises = []; 
     console.log(bookmakers.length); 
     for (i = 0; i < bookmakers.length; ++i) { 
     promises.push(doSomethingAsync(i, bookmakers[i])); 
     } 

     Promise.all(promises) 
      .then((results) => { 
      console.log("All done", results); 
      }) 
      .catch((e) => { 
       // Handle errors here 
      }); 
    } 

    // test(); 

    $(".goscrape").click(function(){ 
     test(); 
    }); 

promises not working

あなたがコンソールから見ることができるように、AJAXは順番に実行されているから約束を妨げています。 1つの約束が終わるまで待ってから次のものに移ります。あなたは約束を順に実行していることを確認したい場合は、このような再帰で何かを行うことができ

+0

asnyc/await? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function –

+2

ランダムタイムアウトの後ではなく、ajax success関数の約束を解決する必要があります。 – Danmoreng

+0

私は、 JavaScriptを有効にする方法については「JavaScriptの設定方法」をご覧ください。私は今タイムアウトを見る。どうすればjavascriptの約束を解決できますか? – desbest

答えて

1

で何が起こっているのか

function test() { 
    runPromise(0); 
} 

function finish(err) { 
    if (err) console.log(err); 
    console.log('finished!'); 
} 

function runPromise(index) { 
    // jump out of loop if there are no more bookmakers 
    if (index >= bookmakers.length) return finish(); 

    doSomethingAsync(index, bookmakers[index]).then((value) => { 
    // do something with the value 
    // ... 
    // iterate to the next promise 
    runPromise(index + 1); 
    }).catch((err) => { 
    // break out of loop when an error occurs 
    finish(err); 
    }); 
} 
1

実は、Promise.allための保証はありませんすべての約束を順番に解決する プロミスは作成時にタスクを開始し、Promise.allは単に解決を待っています。 あなたが順番に解決する方法をお探しの場合は、

promises.reduce((promise,function) => p.then(function),Promise.resolve()); 
関連する問題