用循环实现 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。