首页 > 解决方案 > 异步 npm 模块中的错误回调

问题描述

我正在使用这个异步模块在另一个模块request的帮助下异步请求 Web 内容,因为这是一个异步调用。使用async.each方法,从每个链接请求数据,结果也由scrap()函数成功返回(我已经写了废弃返回的 html 数据并将其作为燃料价格数组按状态返回)。

现在,问题是当我尝试将价格返回到async.each()usingcb(null, prices)时,它显示console.log(prices)undefined 但在 内登录_check_fuel_prices(),工作正常。似乎回调仅适用于一个参数(或仅错误回调,如async.each上面链接中的示例所示)。如果我想返回价格怎么办(我可以用类似的错误更改它cb(prices),但我也想记录错误)。

router.get('/someRoute', (req, res, next) => {
    const fuels = ['diesel', 'petrol'];
    async.each(fuels, _check_fuel_prices, (err, prices) => {
        if (!err) {
            res.statusCode = 200;
            console.log(prices);
            return res.json(prices);
        }
        res.statusCode = 400;
        return res.json(err);
    });

    function _check_fuel_prices(fuel, cb) {
        let prices = '';
        const url_string = 'http://some.url/';
        request(`${url_string}-${fuel}-price/`, (error, response, html) => {
            if (error) {
                cb(error, null);
                return;
            }
            if (response.statusCode === 404) {
                console.log(response.statusCode);
                cb('UNABLE TO FIND PAGE', null);
                return;
            }
            prices = scrap(html, fuel);
            console.log(prices);
            cb(null, prices);
            return;
        });
    }
});

标签: javascriptnode.jsasynchronous

解决方案


正如@generalhenry指出的那样,我能够prices通过使用async.mapwhich 返回错误第一个回调而不是错误来获得,除了async.series可以通过稍微更改代码在此处使用之外。


推荐阅读