我不是Node程序员,但我对单线程非阻塞IO模型的工作原理感兴趣.在我阅读了文章理解-node-js-event-loop之后,我真的很困惑.它给出了该模型的一个例子:
c.query(
'SELECT SLEEP(20);',
function (err, results, fields) {
if (err) {
throw err;
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<html><head><title>Hello</title></head><body><h1>Return from async DB query</h1></body></html>');
c.end();
}
);
Run Code Online (Sandbox Code Playgroud)
这是一个问题.当有两个请求A(至上)和B,由于只有一个线程,服务器端程序将处理请求的第一:做SQL查询这是一个睡眠声明站立I/O等待.并且程序停留在I/O等待,并且无法执行呈现网页的代码.程序会在等待期间切换到请求B吗?在我看来,由于单线程模型,没有办法从一个请求切换另一个请求.但是示例代码的标题说"除了代码之外,所有内容都是并行运行".(PS我不确定我是否误解了代码,因为我从未使用过Node.)节点如何在等待期间切换到B?你能用一种简单的方法解释Node的单线程非阻塞IO模型吗?如果你能帮助我,我将不胜感激.:)
我有一个React组件,我想从文件中加载我的JSON数据.控制台日志当前不起作用,即使我将变量数据创建为全局变量
'use strict';
var React = require('react/addons');
// load in JSON data from file
var data;
var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.open("get", "data.json", true);
oReq.send();
function reqListener(e) {
data = JSON.parse(this.responseText);
}
console.log(data);
var List = React.createClass({
getInitialState: function() {
return {data: this.props.data};
},
render: function() {
var listItems = this.state.data.map(function(item) {
var eachItem = item.works.work;
var photo = eachItem.map(function(url) {
return (
<td>{url.urls}</td>
)
});
});
return <ul>{listItems}</ul>
}
});
var redBubble = React.createClass({ …Run Code Online (Sandbox Code Playgroud) var logs = [{
mobilenumber: '1',
ref: 3,
points: 1000,
ctype: 'mycredit',
entry: 'sdfsdf',
entry: 0
}, {
mobilenumber: '1',
ref: 6,
points: 2000,
ctype: 'mycredit',
entry: 'sdfsdf',
entry: 0
}, {
mobilenumber: '2',
ref: 7,
points: 2600,
ctype: 'mycredit',
entry: 'sdfsdf',
entry: 0
}, {
mobilenumber: '2',
ref: 15,
points: -1500,
ctype: 'mycredit',
entry: 'sdfsdf',
entry: 0
}, {
mobilenumber: '10',
ref: 15,
points: 800,
ctype: 'mycredit',
entry: 'sdfsdf',
entry: 0
}, {
mobilenumber: '11',
ref: 15,
points: 110, …Run Code Online (Sandbox Code Playgroud)为什么我得不到结果?
var sql_data = connection.query(sql, function(error, results, fields) {
if(error) {
console.log(error);
return;
}
var rows = JSON.parse(JSON.stringify(results[0]));
console.log(rows);
});
console.log(rows);
Run Code Online (Sandbox Code Playgroud)
第一个 console.log 没问题,显示对象,但第二个说:
参考错误:行未定义
怎么了?..
每个人都建议在Node.js中使用异步(非阻塞)函数而不是同步函数.
那么如果不推荐使用node.js中的同步函数,那该怎么办?
例如:为什么使用fs.readFileSync()if fs.readFile()可以做同样的工作而不阻塞?
使用节点的文件I/O时,我发现这两个函数(fs.exists和fs.existsSync)来检查系统中是否存在文件.它们之间有什么区别?
根据JavaScript,Node.js:Array.forEach是异步的吗?,Array.forEach是同步的。但是,对于下面的代码:
function wait5() {
return new Promise(resolve =>
setTimeout(resolve, 5000));
}
async function main() {
console.log("Start");
[1,2].forEach(async (e) => {
const d = await wait5().then(()=> console.log("5s later") )
})
console.log("This should come last!");
}
main();
Run Code Online (Sandbox Code Playgroud)
输出为:
Start
This should come last!
5s later
5s later
Run Code Online (Sandbox Code Playgroud)
两个“ 5s之后”迅速相继问世。
为什么会这样呢?
如果我使用普通for循环:
async function main() {
console.log("Start");
for (let i=0;i<2;i++) {
const d = await wait5().then(()=> console.log("5s later") )
}
console.log("This should come last!");
}
Run Code Online (Sandbox Code Playgroud)
那么结果就是我想要的:
Start
5s later …Run Code Online (Sandbox Code Playgroud) 我是编程的新手。我的本地数据库中有一个名为“Practice”的集合,其中包含“名称、角色、组织”。我想弄清楚如何使用猫鼬在 .ejs 文件中打印此信息。
在我的 server.js 中,我有
require('./app/routes.js')(app, passport);
mongoose.connect(configDB.url); // connect to our database
var schema = mongoose.Schema;
mongoose.model('practice', new schema({ Name: String, Role: String, Org: String}),'practice');
var practice = mongoose.model('practice');
practice.find({}, function(err, data) { console.log(err, data); });
Run Code Online (Sandbox Code Playgroud)
在路线中,
app.get('/profileface', isLoggedIn, function(req, res) {
res.render('profileface.ejs', {
user : req.user
});
});
Run Code Online (Sandbox Code Playgroud)
在视图文件夹中的文件 profileface.ejs 中,我有以下内容可以打印我的“练习”集合中的名称。
<%= practice.name %>
Run Code Online (Sandbox Code Playgroud)
虽然它在控制台中打印,但当我尝试访问 profileface.ejs 时,出现以下错误。
ReferenceError: C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\views\profileface.ejs:36 34| </div> 35| >> 36| <%= practice.name %> 37| 38| <!-- <div class="text-center"> 39| <p>Assignment for …Run Code Online (Sandbox Code Playgroud)