在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
不调用某些条件的回调,这将无法正常工作。