如何在while循环中使用fetch

时间:2017-07-10 09:25:16

标签: javascript ecmascript-6

我的代码是这样的:

var trueOrFalse = true;
while(trueOrFalse){
    fetch('some/address').then(){
        if(someCondition){
            trueOrFalse = false;
        }
    }
}

但我无法发出获取请求。似乎while循环计划许多提取进入下一个tick。但永远不要跳到下一个滴答。 我该如何解决这个问题呢?

4 个答案:

答案 0 :(得分:4)

while(true)会创建一个无限循环,它会尝试在单个"内强烈呼叫fetch 无数次蜱" 即可。由于它永远不会完成发出新的fetch调用,因此它永远不会进入下一个时钟。

此功能非常耗费CPU,可能会锁定整个页面。

解决方案是什么?

你可能要做的就是继续抓取,直到结果满足某些条件。您可以通过检查then回调中的条件并重新发布fetch(如果它是false来实现此目的:



var resultFound = false;

var fetchNow = function() {
  fetch('some/address').then(function() {
    if(someCondition) {
      resultFound = true;
    }
    else {
      fetchNow();
    }
  });
}

fetchNow();




这样,而不是

fetch!
fetch!
fetch!
fetch!
...

......行为将是

fetch!
  wait for response
  check condition
if false, fetch!
  wait for response
  check condition
if true, stop.

......这可能是你的预期。

答案 1 :(得分:3)

while循环为sync,其中fetchasync,因此while不会等待fetch async操作完成并立即进入下一次迭代。

您可以像下列这样同步实现:

function syncWhile(trueOrFalse){
    if(trueOrFalse) {
    fetch('some/address').then(){
        if(someCondition){
            trueOrFalse = false;
        }
        syncWhile(trueOrFalse);
    }
  }
}
syncWhile(true);

答案 2 :(得分:1)

现在有了async / await,我们可以使用真棒的while循环来做一些有趣的事情。

var getStuff = async () => {

    var pages = 0;

    while(true) {

        var res = await fetch(`public/html/${pages ++}.html`);

        if(!res.ok) break; //Were done let's stop this thing

        var data = await res.text();

        //Do something with data

    };

    waiting(); //Wont't run till the while is done

};

答案 3 :(得分:0)

while循环会在其中任何一个提取到达then()之前触发所有提取,因此while循环在这里是不正确的,即使我没说也没用。

您需要让then()负责是否继续抓取。

您的then()语法似乎也是错误的(可能只是编辑示例时出错)。此外,您可以省略布尔辅助变量(除非您在其他地方需要它)。

function fetchUntilCondition(){
    fetch('some/address').then(function(response){
        if(!someCondition) {
           fetchUntilCondition(); // fetch again
        }
    });
}
fetchUntilCondition();