最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

在Node.js的异步功能

IT培训 admin 4浏览 0评论

在Node.js的异步功能

我在我的Node.js API端点返回由谷歌检索用刮板库提供结果的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(结果)和res.json({}的结果)的scraper.search功能完成后发生。它目前始终返回一个空数组。

传递给scraper.search()函数的函数被调用每一个结果。所以,如果有10个结果函数运行10次,这就是为什么我在等待,直到数组已满发送响应。

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


这是使用LIMIT变量来检查我的结果对阵列解决。概述了标记为正确下面的答案。

感谢大家的输入。


回答如下:

回调外把res.send会导致类似于this problem竞争状态。 google-search-scraper库的一个缺点是,它不是设计来收集结果。

这应该是固定的:

var LIMIT = 10;
var options = { limit: LIMIT, ... };

var results = [];
var errs = [];
var resultsCount = 0;

function resultsHandler() {
    if (errs.length) {
       // handle error
    } else
       res.json({ results });
}

scraper.search(options, function resultHandler(err, url, meta) {
    if (err)
        errs.push(err);
    else {
        var result = {
            title: meta.title,
            meta: meta.meta,
            description: meta.desc
        };

        results.push(result);
    });

    resultsCount++;

    if (resultsCount === LIMIT)
       resultsHandler();
});

如果有可能为search不调用某些条件的回调,这将无法正常工作。

在Node.js的异步功能

我在我的Node.js API端点返回由谷歌检索用刮板库提供结果的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(结果)和res.json({}的结果)的scraper.search功能完成后发生。它目前始终返回一个空数组。

传递给scraper.search()函数的函数被调用每一个结果。所以,如果有10个结果函数运行10次,这就是为什么我在等待,直到数组已满发送响应。

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


这是使用LIMIT变量来检查我的结果对阵列解决。概述了标记为正确下面的答案。

感谢大家的输入。


回答如下:

回调外把res.send会导致类似于this problem竞争状态。 google-search-scraper库的一个缺点是,它不是设计来收集结果。

这应该是固定的:

var LIMIT = 10;
var options = { limit: LIMIT, ... };

var results = [];
var errs = [];
var resultsCount = 0;

function resultsHandler() {
    if (errs.length) {
       // handle error
    } else
       res.json({ results });
}

scraper.search(options, function resultHandler(err, url, meta) {
    if (err)
        errs.push(err);
    else {
        var result = {
            title: meta.title,
            meta: meta.meta,
            description: meta.desc
        };

        results.push(result);
    });

    resultsCount++;

    if (resultsCount === LIMIT)
       resultsHandler();
});

如果有可能为search不调用某些条件的回调,这将无法正常工作。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论