我的代码是这样的:
var trueOrFalse = true;
while(trueOrFalse){
fetch('some/address').then(){
if(someCondition){
trueOrFalse = false;
}
}
}
但我无法发出获取请求。似乎while循环计划许多提取进入下一个tick。但永远不要跳到下一个滴答。 我该如何解决这个问题呢?
答案 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
,其中fetch
为async
,因此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();