Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js中创建自定义异步函数_Javascript_Node.js_Asynchronous_Callback_Event Loop - Fatal编程技术网

Javascript 在Node.js中创建自定义异步函数

Javascript 在Node.js中创建自定义异步函数,javascript,node.js,asynchronous,callback,event-loop,Javascript,Node.js,Asynchronous,Callback,Event Loop,我正在努力学习异步逻辑,我脑子里有大问题 我知道Node.js中几乎每个函数都是异步的。 我认为我们的节点函数是这样写的,所以指针赋值发生在事件循环中。(Node.js到Posix单线程)。 因此,事件循环(借助于编写的异步函数)允许node js无阻塞地运行 据我所知,我们必须异步编写函数(至少这会很有用) 问题1:我们是否应该异步编写在Node.js中编写的函数?如果我写的话会有用吗? 如果是,它是否有助于事件循环? 如果我们不异步写呢? (每秒一个功能或每分钟一个功能) 我知道应该使用回调

我正在努力学习异步逻辑,我脑子里有大问题

我知道Node.js中几乎每个函数都是异步的。 我认为我们的节点函数是这样写的,所以指针赋值发生在事件循环中。(Node.js到Posix单线程)。 因此,事件循环(借助于编写的异步函数)允许node js无阻塞地运行

据我所知,我们必须异步编写函数(至少这会很有用)

问题1:我们是否应该异步编写在Node.js中编写的函数?如果我写的话会有用吗? 如果是,它是否有助于事件循环? 如果我们不异步写呢? (每秒一个功能或每分钟一个功能)

我知道应该使用回调。然后我了解到使用回调(s:code1)无法实现异步化。然后我了解到nextTick或应该使用setTimeout之类的函数。 我们应该在nodejs中使用nexttick yada settimeout吗

代码1:它是同步的

function sum(x, y, cb) {
  for (let index = 0; index < 100000000; index++) {}
  cb(x + y);
}

console.log(0);

sum(1, 2, cb => {
  console.log(cb);
});

console.log(10);

// 0, 3, 10
<代码>功能和(x、y、cb){ 对于(让index=0;index<100000000;index++){} cb(x+y); } 控制台日志(0); 总和(1,2,cb=>{ 控制台日志(cb); }); 控制台日志(10); // 0, 3, 10 代码2:它是异步使用的(nextTick或setTimeout无关紧要)

函数和(x,y,cb){
process.nextTick(()=>{
对于(让index=0;index<100000000;index++){}
cb(x+y);
});
}
控制台日志(0);
总和(1,2,cb=>{
控制台日志(cb);
});
控制台日志(10);
// 0, 10, 3
问题2:不同的process.nextTick-setTimeOut 考试一:这是同步

function sum(x, y, callback) {
  process.nextTick(() => {
    for (let index = 0; index < 10000000000; index++);
    callback(x + y);
  });
}

var mul = (x, y) =>
  new Promise((resolve, reject) => {
    resolve(x * y);
  });

sum(2, 3, cb => {
  console.log(cb);
});

mul(5, 5).then(cb => {
  console.log(cb);
});
函数和(x,y,回调){
process.nextTick(()=>{
对于(让索引=0;索引<1000000000;索引++);
回调(x+y);
});
}
var mul=(x,y)=>
新承诺((解决、拒绝)=>{
解析(x*y);
});
总和(2,3,cb=>{
控制台日志(cb);
});
mul(5,5)。然后(cb=>{
控制台日志(cb);
});
它是异步的

function sum(x, y, callback) {
  setTimeout(() => {
    for (let index = 0; index < 10000000000; index++);
    callback(x + y);
  }, 0);
}

var mul = (x, y) =>
  new Promise((resolve, reject) => {
    resolve(x * y);
  });

sum(2, 3, cb => {
  console.log(cb);
});

mul(5, 5).then(cb => {
  console.log(cb);
});
函数和(x,y,回调){
设置超时(()=>{
对于(让索引=0;索引<1000000000;索引++);
回调(x+y);
}, 0);
}
var mul=(x,y)=>
新承诺((解决、拒绝)=>{
解析(x*y);
});
总和(2,3,cb=>{
控制台日志(cb);
});
mul(5,5)。然后(cb=>{
控制台日志(cb);
});
为什么?

谢谢你的启发性回答。 你能给我推荐关于这个话题的任何文档或教育吗


谢谢。

process.nextTick()
setTimeout()
这样的函数实际上不会使代码异步运行。相反,它们会更改代码运行的时间,但在代码运行时仍然是同步的。因此,您可以使用这些函数将某些运行延迟到稍后的某个时间。例如,在任何一个
sum()
函数中,如果巨型
For
循环需要5秒钟才能运行,那么无论您是立即运行它,还是在使用
process.nextTick()
setTimeout()
运行时延迟,它都会将事件循环阻塞5秒钟。所有这些函数所做的只是在运行时进行更改。有时,改变它运行的时间是可取的,但这并不能使某些东西不阻塞

实际上,不能用纯Javascript从头开始编写异步函数。js中的Javascript是单线程的,因此根据定义,您编写的任何Javascript都不会在后台运行。要真正实现异步,异步函数必须实际利用本机代码,在本机代码中可以使用线程或非阻塞操作系统函数

因此,要实际异步运行
for
循环(您的其他Javascript可以在
for
循环运行的同时运行),您必须使用本机代码在线程中使用本机代码运行它,或者启动一个子node.js进程在另一个node.js进程中运行它,并让操作系统管理并发性

当然,您可以编写Javascript来调用已经用本机代码编写的异步函数(例如
fs
http
模块中的函数),但即使这样,如果您在Javascript中执行任何耗时的操作(比如处理大的结果),这仍然需要时间,当您运行Javascript处理如此大的结果时,其他Javascript无法运行


异步代码的编写、测试和调试通常比同步代码复杂得多。所以,您很少希望将实际阻塞和同步的东西放在异步API后面,因为这只会使事情变得比需要的更复杂

如果您需要使用
process.nextTick()
setTimeout()
来安排某些东西在将来某个时间运行,这很好,那么将其放在promise接口后面是有意义的


但是,如果在运行时延迟对代码结构没有明显的好处,那么将其放在promise接口后面只会使其使用更加复杂。同步代码更简单。我的五大编程规则之一是不要让任何事情变得比它需要的更复杂(通常被称为接吻-保持简单愚蠢)。这在这里也适用。

这是一个很好的问题,但太宽泛,也太固执己见了。我意识到我把并行和异步混淆了。感谢您的回复,我非常接近于理解:)thx再次。
function sum(x, y, callback) {
  setTimeout(() => {
    for (let index = 0; index < 10000000000; index++);
    callback(x + y);
  }, 0);
}

var mul = (x, y) =>
  new Promise((resolve, reject) => {
    resolve(x * y);
  });

sum(2, 3, cb => {
  console.log(cb);
});

mul(5, 5).then(cb => {
  console.log(cb);
});