重试获取请求不返回任何内容

时间:2021-06-11 19:59:53

标签: javascript node.js fetch node-fetch

这是当前的代码和我想出的:

function getToken() {
    return new Promise(async (resolve, reject) => {
        try {
            let res = await fetch(url);

            if (res.status === 418) {
                setTimeout(getToken, 1000);
            } else {
                let token = await res.text();
                console.log("1", token);
                resolve(token);
            }
        } catch(e) {
            reject(e);
        }
    });
}

async function test() {
    let token = await getToken();
    console.log("2", token);
}

test();

它记录 1 <token> 但它没有像它应该记录的那样记录另一部分 (2 <token>)。我有什么遗漏或做错了吗?

3 个答案:

答案 0 :(得分:1)

非常天真的方法是将“睡眠”函数和标准 async/await 语法混合使用(无需将 then 混入其中)。

如果 URL 始终返回 418 http 代码,这不会考虑可能的无限循环。

最需要注意的是,我在重试中返回 getToken(),并在 else 中返回 token。如果我们不这样做,token 内的 test 将始终是未定义的。

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getToken() {
  try {
    let res = await fetch('https://httpstat.us/200');

    if (res.status === 418) {
      await sleep(1000);
      return getToken();
    } else {
      let token = await res.text();
      console.log("1", token);
      return token;
    }
  } catch (e) {}
};

async function test() {
  let token = await getToken();
  console.log("2", token);
}

test();


答案 1 :(得分:0)

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

function get(url, retryStatusCode) {
    return new Promise(async (resolve, reject) => {
        let found = false;
        while (found !== true) {
            try {
                await sleep(1000);
                await fetch(url).then(res => { 
                    let text = res.text(); 
                    let status = res.status;
                    if (status !== retryStatusCode) {
                        found = true;
                        resolve(text);
                    }
                });
            } catch (error) {
                reject(error);
            }
        }
    });
};

然后await get(url, 404)

答案 2 :(得分:-1)

然后使用

await fetch(url).then(res=>console.log(res).catch(err=>console.log(err);

我只是在这里记录资源,你可以用它做任何你想做的

相关问题