Node JS:While循环检查状态直到获取成功
NodeJS : While loop check the status untill sucess in fetch
我有以下代码调用 api 并使用 node-fetch 获取状态。我需要使用 node-fetch 2.6.1 并使用类似 .then-->.then 的代码无法使用 async await .
function fetching(){
fetch(jobsurl, requestOptions)
.then(response => response.text())
.then(result => {
console.log("------------the job id is ------------");
console.log(eval(result)[0]["id"])
console.log("\n\n\n\n\n")
console.log("--------------The Job Status is------------");
console.log(eval(result)[0]["status"])
console.log("\n\n\n\n\n")
var job_id=eval(result)[0]["id"].toString();
var stat=eval(result)[0]["status"];
while(stat != "success"){
fetch(jobsurl, requestOptions)
.then(response => response.text())
.then(result => {
console.log("------------the job id is ------------");
console.log(eval(result)[0]["id"])
console.log("\n\n\n\n\n")
console.log("--------------The Job Status is------------");
console.log(eval(result)[0]["status"])
console.log("\n\n\n\n\n")
job_id=eval(result)[0]["id"].toString();
stat=eval(result)[0]["status"];
}
// as it is success so call the main url
fetch()....
}//ftehcing end
现在它在 then
中有 stat 变量,它给出作业状态成功或待定,如果成功则只有我可以继续。但是为此,我需要迭代并检查每次何时会成功。所以我使用了 while 循环。
但它不起作用。每次通过在其中调用 fetch 来检查统计值。
请推荐
这里是对您的代码的 async
/await
修改,它使循环变得非常简单。
还有
- 正确的错误处理(使用
response.ok
)
- 不使用
eval
– response.json()
应该做你想做的事
- 请求之间的延迟(以免服务器以毫秒为单位发送垃圾邮件)
function delay(number) {
return new Promise(resolve => setTimeout(resolve, number));
}
async function fetching() {
while (true) {
const response = await fetch(jobsurl, requestOptions);
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
const results = await response.json();
const {id, status} = results[0];
console.log(`Job ${id} status: ${status}`);
if (status === 'success') {
break;
}
await delay(500); // Wait for a bit before re-requesting
}
// Call main url..?
}
编辑:如果你绝对不能使用async
/await
,你需要使用递归函数,像这样,而且很难读。
function delay(number) {
return new Promise((resolve) => setTimeout(resolve, number));
}
function fetching() {
function _recursive() {
return fetch(jobsurl, requestOptions)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
return response.json();
})
.then(results => {
const {id, status} = results[0];
console.log(`Job ${id} status: ${status}`);
if (status === 'success') {
return results;
}
return delay(500).then(_recursive);
});
}
return _recursive();
}
function main() {
fetching().then(results => {
console.log(results);
// call main URL..?
});
}
我有以下代码调用 api 并使用 node-fetch 获取状态。我需要使用 node-fetch 2.6.1 并使用类似 .then-->.then 的代码无法使用 async await .
function fetching(){
fetch(jobsurl, requestOptions)
.then(response => response.text())
.then(result => {
console.log("------------the job id is ------------");
console.log(eval(result)[0]["id"])
console.log("\n\n\n\n\n")
console.log("--------------The Job Status is------------");
console.log(eval(result)[0]["status"])
console.log("\n\n\n\n\n")
var job_id=eval(result)[0]["id"].toString();
var stat=eval(result)[0]["status"];
while(stat != "success"){
fetch(jobsurl, requestOptions)
.then(response => response.text())
.then(result => {
console.log("------------the job id is ------------");
console.log(eval(result)[0]["id"])
console.log("\n\n\n\n\n")
console.log("--------------The Job Status is------------");
console.log(eval(result)[0]["status"])
console.log("\n\n\n\n\n")
job_id=eval(result)[0]["id"].toString();
stat=eval(result)[0]["status"];
}
// as it is success so call the main url
fetch()....
}//ftehcing end
现在它在 then
中有 stat 变量,它给出作业状态成功或待定,如果成功则只有我可以继续。但是为此,我需要迭代并检查每次何时会成功。所以我使用了 while 循环。
但它不起作用。每次通过在其中调用 fetch 来检查统计值。
请推荐
这里是对您的代码的 async
/await
修改,它使循环变得非常简单。
还有
- 正确的错误处理(使用
response.ok
) - 不使用
eval
–response.json()
应该做你想做的事 - 请求之间的延迟(以免服务器以毫秒为单位发送垃圾邮件)
function delay(number) {
return new Promise(resolve => setTimeout(resolve, number));
}
async function fetching() {
while (true) {
const response = await fetch(jobsurl, requestOptions);
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
const results = await response.json();
const {id, status} = results[0];
console.log(`Job ${id} status: ${status}`);
if (status === 'success') {
break;
}
await delay(500); // Wait for a bit before re-requesting
}
// Call main url..?
}
编辑:如果你绝对不能使用async
/await
,你需要使用递归函数,像这样,而且很难读。
function delay(number) {
return new Promise((resolve) => setTimeout(resolve, number));
}
function fetching() {
function _recursive() {
return fetch(jobsurl, requestOptions)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
return response.json();
})
.then(results => {
const {id, status} = results[0];
console.log(`Job ${id} status: ${status}`);
if (status === 'success') {
return results;
}
return delay(500).then(_recursive);
});
}
return _recursive();
}
function main() {
fetching().then(results => {
console.log(results);
// call main URL..?
});
}