Nodejsasynchronous执行
我正在与我公司的数据库工作,我正在尝试build立一个路线。 我得到的数据是1000个值的JSON数组。
这里的function –
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应该推入到调用堆栈,同时执行其他function,但发生了什么是我得到预期的回应。 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的价值作为响应我得到一个空的对象。 我发现这种行为很奇怪! 有人可以向我解释这一点。
它认为这可能是expression你的号码变成一个对象。 根据文档发送可以接受一个缓冲区,string或数组。
https://expressjs.com/en/4x/api.html#res.send
尝试类似于:res.status(200).send({num:x});
嗨亲爱的节点是asynchronous编程语言,因为它在内部会跳过需要更多时间执行的函数,它会首先发送响应。
所以你必须使用节点内的同步概念
你可以参考asynchronous包
同步包