用循环实现 javascript 回调
implementing javascript callback with loop
我是异步编程的新手,似乎无法解决这个问题。
我正在构建这个 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:TATAMOTORS
9708440
NASDAQ:FB
296878244325128
undefined:undefined
b90630ec-0a95-4373-93f8-2c36a336335d
NASDAQ:AAPL
22144
网络服务返回 400
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,3:50PM GMT+5:30
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,11:35AM 美国东部时间
{ 删除: 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 returned 400"。
所以我想为每个公司获取更新命令的状态
NASDAQ:MSFT
358464
{ 删除: 0,
错误:0,
已插入:0,
替换为:1,
跳过: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。
我是异步编程的新手,似乎无法解决这个问题。 我正在构建这个 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:TATAMOTORS
9708440
NASDAQ:FB
296878244325128
undefined:undefined
b90630ec-0a95-4373-93f8-2c36a336335d
NASDAQ:AAPL
22144
网络服务返回 400
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,3:50PM GMT+5:30
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,11:35AM 美国东部时间
11 月 8 日,11:35AM 美国东部时间
{ 删除: 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 returned 400"。
所以我想为每个公司获取更新命令的状态
NASDAQ:MSFT
358464
{ 删除: 0,
错误:0,
已插入:0,
替换为:1,
跳过: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。