如何在while循环中使用提取

kra*_*ave 4 javascript ecmascript-6

我的代码是这样的:

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

但是我无法发出获取请求。看起来,虽然while循环将许多获取调度到下一个滴答中。但是千万不要跳到下一个刻度。我该如何解决这个问题?

Mát*_*osi 7

while(true)创建一个无限循环,该循环将尝试在单个“滴答”中fetch 无限次调用。由于它永远不会完成发出新的呼叫,因此它永远不会到达下一个刻度。fetch

此功能占用大量CPU,可能会锁定整个页面。


有什么解决方案?

您可能要尝试做的就是继续获取​​数据,直到结果满足某些条件为止。您可以通过检查then回调中的条件,然后重新发出fetchif(如果是)来实现false

var resultFound = false;

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

fetchNow();
Run Code Online (Sandbox Code Playgroud)

这样,代替

fetch!
fetch!
fetch!
fetch!
...
Run Code Online (Sandbox Code Playgroud)

...行为将是

fetch!
  wait for response
  check condition
if false, fetch!
  wait for response
  check condition
if true, stop.
Run Code Online (Sandbox Code Playgroud)

...这可能是您所期望的。


Dar*_*rum 6

现在有了 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

    };

    console.log("Look ma! I waited!"); //Wont't run till the while is done

};
Run Code Online (Sandbox Code Playgroud)