【问题标题】:nodejs trouble while updating array asynchronouslynodejs在异步更新数组时遇到问题
【发布时间】:2017-01-10 09:37:01
【问题描述】:

我遇到了 nodejs 的异步问题。希望你能帮助我。

exports.DeviceInfo = function(req, res, next) {
  var nets = req.body.networks;

  db.collection("device", function(err, deviceConf) {
    var detected_beacons = [];

    if (!err) {
      for (var i = 0; i < nets.length; i++) {
        deviceConf
          .find({
            "data.number": nets[i]
          })
          .toArray(function(errFind, saver) {
            if (!errFind && saver) {
              saver.forEach(function(disp) {
                var detected = {};
                detected.address = disp.address;
                detected_beacons.push(detected);
                console.log(detected_beacons);
              });
            }
          });
      }
      console.log(detected_beacons);
      res.json(detected_beacons);
    } else {
      console.error(err);
      res.status(500);
      res.json({
        message: "Couldn't connect to database"
      });
    }
  });
};

如果我写一些日志,我们可以看到问题所在。在 for 子句之前返回检测到的信标。我想在 for 之后返回,以便充满数据。我已阅读有关回调和承诺的信息,但我不知道如何在我的代码中使用它们。

【问题讨论】:

  • 看cmets到stackoverflow.com/q/39288896/18771。您的代码中存在完全相同的错误。
  • 我已经用 forEach 改变了 for 循环,但同样的问题。
  • 没有出现错误,但结果是一样的。 @Tomalak
  • Promise.all( ... ).then( ... ) 是你的朋友。
  • 我尝试使用它,但我不知道在我的代码中写在哪里@moon

标签: node.js asynchronous server q


【解决方案1】:

试试这个代码。你不能做一个关于回调函数的 for 循环。

exports.DeviceInfo= function(req,res,next){
var nets = req.body.networks;
db.collection("device", function(err, deviceConf){
    var detected_beacons = [];
    var netSize = nets.length;
    var beaconsLoop = function(i) {
        deviceConf.find({"data.number" : nets[i]}).toArray(function(errFind, saver){
                if (!errFind && saver){
                    var saverSize = saver.length;
                    saver.forEach(function(disp){
                        var detected = {};
                        detected.address = disp.address;
                        detected_beacons.push(detected);
                        saverSize--;
                        if (saverSize == 0) {
                            if (i != netSize - 1) {
                                i++;
                                beaconsLoop(i);
                            } else {
                                res.json(detected_beacons);
                            }
                        }
                    });
                }
            });
    };

    if (!err){
        if (netSize > 0) beaconsLoop(0);
    } else {
        console.error(err);
        res.status(500);
        res.json({message:"Couldn't connect to database"});
    }
});

};

【讨论】:

  • 如果保存器为空,则没有考虑过一个选项。更正重复的 if (i != netSize - 1) { i++; beaconsLoop(i); } else { res.json(detected_beacons); } 。你的解决方案太棒了。谢谢!
【解决方案2】:

我使用map做了一个简单的解决方案:

if (!errFind && saver) {
  var detected_beacons = saver.map(function(disp) {
    return {
      address: disp.address
    };
  });

  console.log(detected_beacons);
  res.json(detected_beacons);
}

这里是完整的code

【讨论】:

  • 这也是有效的,但是不解决异步问题@聂,检测到的_beacons继续先发送,空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2020-11-05
相关资源
最近更新 更多