我是异步编程的新手,似乎无法解决这个问题。 我正在构建这个node.js应用程序来提供股票报价,基本上我需要做的是查询数据库以获取各公司的详细信息。我需要向api发送一个请求,其中包含公司详细信息作为参数,这些参数会给我报价,然后我需要用新报价更新数据库。所以基本上我需要为数据库中的每个公司做这件事。 (我使用rethinkdb作为我的数据库)
这是我的代码
query.companyList(function(err, data){
if(err) {
console.log(err);
}
else {
for(var i = 0;i < 6;i++){
var comp = data.clist[i].exchange+ ':' +data.clist[i].ticker;
console.log(comp);
var cid = data.clist[i].id;
console.log(cid);
googleStocks([comp])
.then(function(data){
console.log((data[0].lt));
r.table('company').get(parseInt(cid)).update({quote:{lastTradeTime:data[0].lt, lastTradePrice:data[0].l_cur, change:data[0].c, changePercent:data[0].cp}}).run()
.then(function(results){
console.log(results);
})
.catch(function(err){
console.log(err);
});
})
.catch(function(error){
console.log(error);
});
}
}
});
我知道这不是异步代码,因为console.logs的输出非常随机。
因此,简而言之,我需要发送和API请求并更新我的数据库中每个公司的报价。
我的输出:
服务器已启动!
NASDAQ:MSFT
358464个
NYSE:F
13606个
NSE:塔塔汽车
9708440个
NASDAQ:FB
296878244325128个
未定义:未定义
b90630ec-0a95-4373-93f8-2c36a336335d
NASDAQ:AAPL
22144个
Webservice返回400
11月8日,美国东部时间上午11:35
格林尼治标准时间11月8日下午3:50 + 5:30
11月8日,美国东部时间上午11:35
11月8日,美国东部时间上午11:35
11月8日,美国东部时间上午11:35
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
忽略“undefined:undefined”和“Webservice返回400”。
那么我想为每家公司获得更新命令的状态
NASDAQ:MSFT
358464
{删除:0,
错误:0,
插入:0,
替换:1,
跳过:0,
不变:0}
如果我不够清楚,我很抱歉。
答案 0 :(得分:0)
尝试这样的事情:
query.companyList(function(err, data){
if(err) {
console.log(err);
}
else {
for(var i = 0;i < 6;i++){
var comp = data.clist[i].exchange+ ':' +data.clist[i].ticker;
console.log(comp);
var cid = data.clist[i].id;
console.log(cid);
(function(_id) {
googleStocks([comp])
.then(function(data){
console.log((data[0].lt));
r.table('company').get(parseInt(_id)).
update({quote:{lastTradeTime:data[0].lt,
lastTradePrice:data[0].l_cur, change:data[0].c,
changePercent:data[0].cp}}).run()
.then(function(results){
console.log(results);
})
.catch(function(err){
console.log(err);
});
})
.catch(function(error){
console.log(error);
});
})(cid);
}
}
});
我没有运行代码,因为我没有环境。但它应该指出你正确的方向。
是的,会发生什么是for循环将运行六次,每次进行异步调用。当结果返回时,cid变量包含最后一个id,只有最后一个id被更新六次。
将代码块封闭到匿名函数中并将其传递给cid,我们确保每次都使用真实的id。