相关疑难解决方法(0)

单线程非阻塞IO模型如何在Node.js中工作

我不是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模型吗?如果你能帮助我,我将不胜感激.:)

node.js

323
推荐指数
5
解决办法
10万
查看次数

JavaScript如何在后台处理AJAX响应?

由于JavaScript在单个线程中运行,在发出AJAX请求后,后台实际发生了什么?我想更深入地了解这一点,任何人都可以解释一下吗?

javascript xmlhttprequest

136
推荐指数
2
解决办法
2万
查看次数

如何在node.js中创建非阻塞异步函数?

如何创建非阻塞异步函数?以下是我想要实现的,但我的程序仍在阻止......

var sys = require("sys");

function doSomething() {
  sys.puts("why does this block?");
  while(true);
}

setTimeout(doSomething,0);
setTimeout(doSomething,0);
setTimeout(doSomething,0);

sys.puts("main");
Run Code Online (Sandbox Code Playgroud)

node.js

23
推荐指数
5
解决办法
3万
查看次数

如何将同步和异步递归函数转换为JavaScript中的迭代

寻找同步和异步递归函数的特定实现,这些函数可以用作将未来递归函数转换为平面迭代的起点.

以下是递归函数的两个示例:同步异步.

我正在寻找的是使用没有递归堆栈的实现.

例如,它可能会像这样工作:

var output = syncStack(myRecursiveFunctionTurnedIterative, [])
Run Code Online (Sandbox Code Playgroud)

或者,如果那是不可能的,那么只需使用堆栈重新实现下面的两个函数,这应该是一个足够好的开始.例如

var stack = []

function circularReferences(object, references, stack) {
  var output = {}
  if (object.__circularid__) return true
  Object.defineProperty(object, '__circularid__', { value: id++ })
  for (var key in object) {
    var value = object[key]
    if (value && typeof value == 'object') {
      console.log(value)
      stack.push(???)
      circularReferences()
      stack.pop()
      if (is) output[key] = '[Circular]'
    } else {
      output[key] = value
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个问题的原因是,多年来我一直在努力学习如何做到这一点,但从未找到过(a)容易记住如何做的系统,以及(b)实用的系统.

同步

javascript algorithm recursion asynchronous node.js

22
推荐指数
1
解决办法
1102
查看次数

允许在nodejs中每毫秒运行一次setInterval

我有一个节点脚本,它应该利用单个节点进程可以获得的所有CPU资源.但我发现setInterval太慢了.

当然,我在文档中发现了这一点:

当延迟大于2147483647或小于1时,延迟将设置为1.

来源:https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args

现在我想知道是否有办法进一步减少限制,或者是否有可以使用的替代功能.

我不能只使用普通循环,因为还有其他需要同时运行的异步事件.

编辑:
再次:我不能只使用普通循环,因为还有其他需要同时运行的异步事件.我不确定为什么这么难理解.

正常循环正在运行时,您将阻止其他所有操作的执行.如果将循环放在另一个异步执行的函数中并不重要.

这是什么意思?

我们来看一些例子:

setInterval(()=>{console.log('a')},1000) // asynchronous thing that needs to run in the background

while (true) {
    // do whatever
}
Run Code Online (Sandbox Code Playgroud)

这段代码会做什么?它会阻止一切.console.log('a')不会连续执行.

setInterval(()=>{console.log('a')},1000) // asynchronous thing that needs to run in the background
setTimeout(()=>{
    while (true) {
        // do whatever
    }
}, 1)
Run Code Online (Sandbox Code Playgroud)

一旦while循环开始,这也将阻止间隔的执行.

javascript loops setinterval node.js

19
推荐指数
3
解决办法
1114
查看次数

JS事件处理程序能否中断另一个处理程序的执行?

我有以下问题.我已经在其构造函数中创建了一个类,我正在加载几个图像,我需要延迟剩余的初始化,直到它们被完全加载.我使用的代码如下(摘自构造函数):

var self = this;
var imagesToLoad = 4;

var finishInit = function() {
    alert(imagesToLoad);
    imagesToLoad--;
    if (imagesToLoad == 0) {
       // remaining initializations
    }
}

this._prevIcon = new Image();
this._prevIcon.onload = finishInit; 
this._prevIcon.src = "img1.png";
this._nextIcon = new Image();
this._nextIcon.onload = finishInit; 
this._nextIcon.src = "img2.png";
this._pauseIcon = new Image();
this._pauseIcon.onload = finishInit; 
this._pauseIcon.src = "img3.png";
this._playIcon = new Image();
this._playIcon.onload = finishInit; 
this._playIcon.src = "img4.png";
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,执行时显示的对话框在Firefox 7中读取4,4,4,4和在IE 9中读取4,3,2,4.我很困惑因为我认为JS是单线程的,因此是一个事件处理程序不应该打断另一个.捕获(或我的错误)在哪里?

提前致谢.此致,Tomek

javascript events

3
推荐指数
1
解决办法
3454
查看次数

为什么无限循环会阻止承诺解决?

我对下面的代码有一个奇怪的问题:在函数调用之后添加一个无限循环将阻止在调用内部解决承诺。

我不明白为什么,以及这个循环如何影响承诺行为

const second_call = () => {
    return new Promise((resolve, reject) => {
        console.log("Second call");
        resolve();
    });
}

const first_call = () => {
    console.log("First call");
    second_call().then(() => {
        console.log("First call, THEN");
    });
}

const main = () => {
    console.log("Started");
    first_call();
    //if if comment the while (true), all debug msgs will be displayed
    //if i uncomment the while (true), the msg "First call, THEN" will not be displayed
    while (true);
}

main();
Run Code Online (Sandbox Code Playgroud)

asynchronous node.js promise

3
推荐指数
1
解决办法
752
查看次数

JavaScript 事件队列和 setTimeout(...)

那段代码发生了什么

var start = new Date();

setTimeout(function() {
    var end = new Date();
    console.log('Time elapsed with func1:',end - start, 'ms');
}, 500);

setTimeout(function() {
    var end = new Date();
    console.log('Time elapsed with func2:',end - start, 'ms');
}, 250);

while (new Date() - start < 1000) {}
Run Code Online (Sandbox Code Playgroud)

日志:

Time elapsed with func2: 1001 ms
Time elapsed with func1: 1017 ms
Run Code Online (Sandbox Code Playgroud)

我预计 func1 将首先被触发,因为它是要添加到事件队列中的第一个事件。然后,由于JS的单线程特性,等到func1返回后再执行队列中的下一个事件func2。
那么,发生了什么?

javascript

2
推荐指数
1
解决办法
1702
查看次数