首页 > 解决方案 > Node.js 中的异步函数

问题描述

我的 Node.js API 中有一个端点,它返回由 Google-Search- scraper库提供的 JSON 结果数组。

app.get('/google_image_search', (req, res) => {
    var options = {
        query: 'grenouille',
        age: 'y', // last 24 hours ([hdwmy]\d? as in google URL)
        limit: 10,
        params: {} // params will be copied as-is in the search URL query string
    };

    var results = [];
    scraper.search(options, function(err, url, meta) {
        sem.take(function() { 
            if(err) throw err;

            var result = {
                title: meta.title,
                meta: meta.meta,
                description: meta.desc
            }
            results.push(result);
            sem.leave();
        });
    })

    console.log(results);

    res.json({
        results
    });
})

我需要 console.log(results) 和 res.json({ results }) 在 scraper.search 功能完成后发生。它目前总是返回一个空数组。

每个结果都会调用传递给 scraper.search() 函数的函数。因此,如果有 10 个结果该函数运行 10 次,这就是为什么我要等到数组已满才发送响应。

我曾尝试在不同的地方使用信号量和互斥锁,但没有运气。任何建议表示赞赏。


这是使用 LIMIT 变量来检查我的结果数组来解决的。在下面标记为正确的答案中概述。

感谢大家的投入。


标签: javascriptnode.jsapiasynchronoussemaphore

解决方案


我需要 console.log(results) 和 res.json({ results }) 在 scraper.search 功能完成后发生。

把它放在最里面的回调中scraper.search()

scraper.search(options, function(err, url, meta) {
        if(err) throw err;

        var result = {
            title: meta.title,
            meta: meta.meta,
            description: meta.desc
        };
        results.push(result);
        console.log(result);
        res.json({results});
});

每次运行回调时console.log()都会调用。res.json()如果您只想在 10 个结果或其他内容后执行此操作,请添加代码以检查条件并仅在正确的时间运行console.log()和/或运行res.json()

您也可以查看async/之类的内容await,但鉴于您发布的代码,以上可能是最增量的解决方案。

你现在的问题console.log()res.json()它正在将异步回调使用函数视为同步。


推荐阅读