Javascript:非阻塞回调(又一次)

时间:2015-11-19 09:34:41

标签: javascript callback blocking

我不是一位经验丰富的开发人员,我花了最近几天试图了解一些关于Javascript的基本概念。 单线程,阻塞与非阻塞和回调。 我读了很多,但我仍然感到困惑。

我的理解是,在一个简单的JS代码中,所有语句都在一个线程内顺序执行。 在更复杂的情况下,存在长时间运行的语句(db调用,网络交互等),这可能是一个巨大的问题。 程序执行(下一个语句)为BLOCKED,直到当前(长时间运行)语句完成。 解决方案是实现一个异步模式,其中长时间运行的语句在后台执行(我在这里可能是完全错误的!),而下一个语句被执行,当长时间运行的语句完成时,它使用回调传回其结果调用语句中提供的函数。

从这里复制并粘贴代码我写了一段简单的代码,我有一个回调函数

// function with callback    
function doSomething(callback) {
    callback();
}

// callback function implementation
function doSomethingElse() {
    document.write("<p>Second element in the page</p>");
}

doSomething(doSomethingElse);   
document.write("<p>First element in the page</p>");

这段代码的结果实际上是我在开始阅读非阻塞和回调(顺序代码执行)之前所期望的:   - 第二个要素   - 第一个元素

所以我的问题是,将我的代码转换为异步非阻塞代码的魔法仙尘是什么?

干杯,乔瓦尼

2 个答案:

答案 0 :(得分:1)

  

将我的代码转换为异步非阻塞代码的魔法仙尘是什么?

通常,大多数长时间运行的操作都将处理API,这些API处理比JavaScript更低级别的异步操作(XMLHttpRequest使HTTP请求成为一个主要的例子)。

如果你需要自己实现一个长时间运行的功能(也许你想在客户端上进行一些繁重的运算),那么你可以使用Web Workers

var myWorker = new Worker("find_prime_numbers.js");
myWorker.onmessage = function(e) {
  console.log('Next prime number is ' + e.data);
}

find_prime_numbers.js

// Calculate some primes
postMessage(my_prime_number);

答案 1 :(得分:1)

您使用了回调,但并不意味着此调用是异步的。

它同步运行doSomething,运行callback并输出&#34;第二个元素&#34;。

如果您在那里进行异步调用,那将是异步的 - AJAX调用,文件系统访问或简单的setTimeout

&#13;
&#13;
function doSomething(callback) {
  setTimeout(callback, 1000);
}

// callback function implementation
function doSomethingElse() {
  document.write("<p>Second element in the page</p>");
}

doSomething(doSomethingElse);   
document.write("<p>First element in the page</p>");
&#13;
&#13;
&#13;

现在,它执行以下操作:运行doSomething,运行setTimeout并在此之后运行doSomethingElse。同时,setTimeout异步等待1秒钟并调用该函数。

在其他情况下,它可能是任何其他异步操作,需要时间才能完成。