如何停止循环时json是空的?



我有一个API,它有分页。但是在jsonnya中没有总页面数据。所以我编写了一个脚本来获取页数。脚本是这样的

$(document).ready(function () {
for (let i = 0; i < 10000; i++) {
console.log(i + 1)
hst = window.location.origin
row = i + 1
rl = hst + "/admin/all?page=" + row + "&limit=15"
fetch(rl)
.then(res => res.json())
.then(data => {
// console.log(data.user_data)
if (i == 2) {
return
}
})
}
})

json

{
"limit": 1,
"page": 3,
"user_data": [
{
"ID": 5,
"CreatedAt": "2021-03-04T17:07:08+07:00",
"UpdatedAt": "2021-03-04T17:07:08+07:00",
"DeletedAt": null,
"Email": "asdasd",
"Password": "asdas",
"Name": "asd",
"UserRoleID": 1,
"UserRole": {
"ID": 1,
"Name": "Admin"
}
}
]
}

如何停止for循环当json "user data"是空的吗?这样的

{
"limit": 1,
"page": 4,
"user_data": [

]
}
``

您似乎误解了代码中的承诺部分。

如果你想这样写,你必须使用async/await语法:


$(document).ready(async function () { //THERE
for (let i = 0; i < 10000; i++) {
console.log(i + 1)
hst = window.location.origin
row = i + 1
rl = hst + "/admin/all?page=" + row + "&limit=15"
const resp = await fetch(rl); //we send the request
const json = await resp.json(); //we get the response body as JSON
if(json.user_data.length === 0) break;
//json contains all your json content

}
})
}
<标题>

为什么?因为承诺是异步的。当它们被解决时,你的forloop将结束很长时间(在计算机规模上)。Promise.then()永远不会阻塞你的线程并继续执行。

所以,如果你在10个元素上循环,你将同时发送10个请求,这些请求将(或不会)在稍后以某种顺序(可能不是你想的)被解析。

有更多关于承诺的信息,如果你想要:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

<标题>异步/等待h1>async/await语法是语法糖:在底层,你得到承诺,但语法允许你以一种看起来的方式编写代码synchronus。它更容易读和写,但你可以做同样的事情。

如果我们再次得到您的示例,您可以这样写(为了摆脱async/await并使用纯Promise语法):

let row = 0;
function fetchThings(){
if(row >= 10000) return;
hst = window.location.origin
row = i + 1
rl = hst + "/admin/all?page=" + row + "&limit=15"
fetch(rl).then(resp=>resp.json()).then((json)=>{
if(json.user_data.length > 0) fetchThings();
})
}
$(document).ready(fetchThings);

可以在for循环中跟踪用户数据的长度。如果为0,则可以使用break语句中断for循环

for(let i=0;i<1000;i++){
if(user_data.length===0){
break 
}
}

最新更新