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异步执行的主要内容,如果未能解决你的问题,请参考以下文章