javascript - 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 变量来检查我的结果数组来解决的。在下面标记为正确的答案中概述。
感谢大家的投入。
解决方案
我需要 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()
它正在将异步回调使用函数视为同步。
推荐阅读
- android - ConstraintLayout.connect() 的 margin 参数是像素还是 dp?
- perl - Perl 默认使用什么顺序来读取目录中的所有文件?
- arrays - 打字稿如何在已经在数组中的数组中查找?
- python - Selenium/python 中的链接位置问题
- android - 无法写入设备存储 Android 10 Build 10.0.0183
- mediawiki - 如何在 mediawiki 文章页面上添加徽章?
- swift - .mlmodels 的枚举?
- haskell - 预期类型:字符串,Haskell 中的实际类型 [[Char]] 错误消息
- typescript - 如何在 CRA 中允许命名空间?
- python - 我们可以在python代码中使用包含linux命令结果的变量吗