Nodejs异步执行

Posted

技术标签:

【中文标题】Nodejs异步执行【英文标题】:Nodejs asynchronicity execution 【发布时间】: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 的值作为响应,我得到一个空对象。我发现这种行为很奇怪!谁能给我解释一下。

【问题讨论】:

【参考方案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。

以上是关于Nodejs异步执行的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs异步执行

NodeJs异步的执行过程

为啥说nodejs是异步非阻塞

Nodejs 等到异步映射函数完成执行

如何等到在nodejs中执行流异步[重复]

nodejs-在函数内执行多个异步调用的最佳方法?