【问题标题】:Nodejs asynchronicity executionNodejs异步执行
【发布时间】:2017-11-14 17:09:27
【问题描述】:

我正在使用我的公司数据库,并且正在尝试设置路线。我得到的数据是一个包含 1000 个值的 JSON 数组。

这是函数--

router.get('some_route', function(req, res, next){
var ress = [];
var name = req.params.name;
baWelcomeController.autoComplete(name).then(function(succ){
    var x = Object.values(succ[0][0]); 
    res.status(200).send(x);
}).catch(function(err){
  res.status(404).send(err);
    console.log("error in router.get", err);
});

});

现在看看我的代码的object.values 部分,从互联网上我知道它是一个 O(n) 函数,所以 nodejs 应该将它推入调用堆栈并同时执行其他函数,但是发生了什么我是否得到了预期的响应。 succ[] 中的值的数量是 1000,所以我写了另一个函数注释 Object.values 并写了一个 for 循环 -

router.get('some_route', function(req, res, next){
var ress = [];
var name = req.params.name;
baWelcomeController.autoComplete(name).then(function(succ){

    var x = 0;
    for(var i = 0; i <= 1000; i++)
        x += i;
    res.status(200).send(x);
}).catch(function(err){
  res.status(404).send(err);
    console.log("error in router.get", err);
});

});

现在我没有得到 x 的值作为响应,我得到一个空对象。我发现这种行为很奇怪!谁能给我解释一下。

【问题讨论】:

    标签: javascript json node.js asynchronous callback


    【解决方案1】:

    嗨,亲爱的,由于Node是异步编程语言,在内部它会跳过执行时间较长的函数,它会首先发送响应。

    所以你必须在节点内使用同步概念

    你可以参考async package

    sync package

    【讨论】:

      【解决方案2】:

      它认为这可能是表达将您的号码变成一个对象。根据文档,发送可以接受缓冲区、字符串或数组。

      https://expressjs.com/en/4x/api.html#res.send

      尝试类似:res.status(200).send({num: x});

      【讨论】:

      • 嘿,因为复杂度是 O(n),所以如果 n >= 10000000,我将得到的 res 是空的。不是吗?
      • 无论 n 是多少,复杂性都不应该改变你的结果。 O(n) 仅仅意味着随着大小的增加 (n),运行算法所需的时间将线性增加。因此,如果 n=1 需要 1 秒,则 n=100 将需要 100 秒。这比运行时间增加得更快的 O(n^2) 更好。 n=1 为 1 秒,n=100 为 10,000 秒。但不如说 O(log n) n=1 => 1 sec, n=100 => 2 sec。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2018-06-13
      • 2020-04-02
      • 2021-02-13
      • 2012-04-01
      相关资源
      最近更新 更多