javascript 重试异步等待

标签 javascript node.js async-await

我有多个异步函数,它们都向服务器发送请求,如果出现错误,它们会捕获错误,然后重试该函数,这些函数依赖于前一个函数的数据,因此它们必须在另外,问题是每当我调用这些函数并且出现错误时,它都会像我想要的那样不断重试,但它会继续执行下一个函数,而不是等待前一个函数返回已解析的响应。

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request1()
    }

}

const request2 = async (data) => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request2()
    }

}

const getData = async() => {
await request1()
await request2()

})

getData()

每当我调用 getData() 函数时,它都会等待第一个请求,但即使有错误,它也会立即处理第二个请求,而不是等待第一个请求解决,我也需要尝试一下捕获我发送的所有请求而不是一个,因为如果出现错误我只想重试该步骤,而不是完整的事情

最佳答案

您不会回电重拨

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        return await request1(); // i'm not sure if you need await here or not, worth testing
    }

}

如果您没有从重新调用中返回,那么您所做的与此基本相同

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request1(); // this does request 1 WITHOUT waiting for a result
    }
    return undefined;    
}

编辑:第一个是一个玩具示例,说明如果您不返回任何内容会发生什么

const rp = {
    get: async function() {
        await new Promise(r => setTimeout(r, 250));
        this.count++;
        if (this.count % 2 === 0) {
            return this.count;
        } else {
            throw new Error('error: even')
        }
    },
    count: 0
};

const request1 = async () => {
    try {
        const data = await rp.get();
        console.log('data in request1', data);
        return data
    } catch (err) {
        request1();
    }
};

const request2 = async (data) => {
    try {
        const data = await rp.get();
        console.log('data in request2', data);
        return data
    } catch (err) {
        request2();
    }

};

const getData = async() => {
    console.log('starting request 1');
    await request1();
    console.log('starting request 2');
    await request2()

};

getData();

这就是您返回时会发生的情况:

const rp = {
    get: async function() {
        await new Promise(r => setTimeout(r, 250));
        this.count++;
        if (this.count % 2 === 0) {
            return this.count;
        } else {
            throw new Error('error: even')
        }
    },
    count: 0
};

const request1 = async () => {
    try {
        const data = await rp.get();
        console.log('data in request1', data);
        return data
    } catch (err) {
        return request1();
    }
};

const request2 = async (data) => {
    try {
        const data = await rp.get();
        console.log('data in request2', data);
        return data
    } catch (err) {
        return request2();
    }

};

const getData = async() => {
    console.log('starting request 1');
    await request1();
    console.log('starting request 2');
    await request2()

};

getData();

您会注意到,在第一个示例中,request2 在 request1 记录其数据之前启动,但在第二个示例中,使用 return 语句,request2 在 request1 获取数据之后才会启动。

关于javascript 重试异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60493858/

相关文章:

javascript - 使用 Angular 2 响应式(Reactive)表单通过单个复选框提交多个值

javascript - Sails.js 无法使用日期范围查询参数获取新创建的用户

C# 异步等待澄清?

javascript - Babel - 使用 transform-async-to-generator 插件时未定义 regeneratorRuntime

javascript - 表达式的结果是什么?

java - 当我在当前 Activity 中按下按钮时如何更改下一个 Activity 背景

javascript - NodeJS del 模块 Promise 需要明确的 Promise 函数吗?

node.js - 如何使用npm脚本重命名文件

node.js - 通过 Node 请求包递归使用 async/await

javascript - 以透明方式在另一张新图像上显示一张新图像(CSS 或 JS)