在 NodeJS 中放置回调的语法和方法
syntax and methods for placing callbacks in nodejs
我在nodejs中使用快速库有以下http端点:
app.get("/api/stocks/lookup/:qry", function(req, res) {
getJson(lookupSearch(req.params.qry), function(json) {
var quotes = [];
und.forEach(json, function(d) {
getJson(quoteSearch(d.Symbol), function(j) {
quotes.push(j);
});
});
res.send(quotes); //how can I make this execute after the .forEach is finished?
});
});
在这里,getJson
看起来像这样:
var getJson = function(search, cb) {
http.request(search, function(response) {
var raw = '';
response.on('data', function(d) {
raw += d;
});
response.on('end', function() {
cb(JSON.parse(raw));
});
response.on('error', function(err) {
console.error(err);
});
}).end();
};
我明白为什么这不起作用,因为getJson
内部的 http 请求是异步的,因此res.send(quotes)
几乎会立即发回。那么,如何在forEach
循环完成后发送res.send(quotes)
。我可以将回调附加到 forEach
函数吗?
综上所述,
forEach
循环完成后如何使用res.send(quotes)
。
是否可以将回调- (例如在
forEach
循环后执行的回调)附加到对象上?我可以将回调附加到什么?需要明确的是,对我来说,"回调"的想法意味着事件循环将在回调附加到的函数/对象完成执行后调用它。
感谢所有的帮助!
将 getJson 转换为承诺将是一个好主意,因为承诺很好用。如果没有承诺,手动方法是保留未完成请求的计数器:
var outstanding = 0;
json.forEach(function(d) {
outstanding++;
getJson(quoteSearch(d.Symbol), function(j) {
quotes.push(j);
if (!--outstanding) {
res.send(quotes);
}
});
});
如果你确实按照承诺的方式走,你会对json
进行map
,并返回请求的承诺;然后你可以在承诺数组上指定一个then
。例如,如果您使用 jQuery 而不是您自己的自制解决方案,
var requests = json.map(function(d) {
return $.getJSON(quoteSearch(d.Symbol), function(j) {
quotes.push(j);
});
});
$.when(requests).then(function() {
res.send(quotes);
});
(未经测试的代码)。
相关文章:
- 使用$scope方法时的ControllerAs语法
- node.js是否具有'match()'方法如果是,语法是什么
- jQuery.html()方法语法
- javascript eval方法语法
- jQuery AJAX Post方法错误(语法错误)
- 将普通js转换为角度语法的快速方法
- 有没有一种简单的转换方法可以将chrome消息传递转换为safari消息传递语法
- 在jQuery方法中编写自定义属性的正确语法是什么
- 调用方法时的Jquery语法
- 在 NodeJS 中放置回调的语法和方法
- 为我的网站使用Facebook API JSON的最简单方法(哪种语言以及如何语法)
- Javascript,设置 onclick 方法语法
- 什么'是调试未捕获语法错误的有效方法
- 如何获得家长'我使用的方法'控制器为'angularjs中的语法
- 如何在AngularJS modal中使用controllerAs语法?的方法
- Javascript语法字典(标准函数、对象、方法和关键字)
- 为什么super可以使用方法语法而不能使用属性语法?
- 解析.然后方法和链接|语法让我迷惑
- 动态窗口语法.开放的方法
- Javascript对象方法语法声明