用循环实现javascript回调

时间:2016-11-08 17:30:13

标签: javascript node.js asynchronous callback rethinkdb

我是异步编程的新手,似乎无法解决这个问题。 我正在构建这个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}

如果我不够清楚,我很抱歉。

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。