Async是如何工作的,以及如何正确使用node.js(node-webkit)

efor此问题,我正在使用Node-Webkit (node.js)和asynchronous ,加载Windows应用程序。

这个问题的原因是明确地回答:

JavaScript和Node.Js中的asynchronous执行意味着什么

我的个人代码问题在问题的末尾。 “案子”。

我将直接用示意图总结来解释所有关于我所遇到的问题。 (我会更新信息,因为你帮我理解它)


概念(理论)

想象一下主屏幕(JS,Html,css,… Node.js框架)和一个后台过程(JS执行每10分钟,JS内部检查,后台数据库优化…)。

不pipe你在主屏幕上做什么都不会影响后台执行(除了一些重要的情况),而且如果需要的话,Background可以改变屏幕(屏幕定时器,关于在线web状态的信息,…)

那么行为是这样的:

主题1: 你在App框架中的行为。 线程2: 背景应用例程

任何完成的动作都会将其输出显示在屏幕上,而不pipeasynchronous并行中的其他动作如何


解释(对我来说)

我认为这是“asynchronous”将会没有问题地处理,并行执行。

async.parallel([ function(){ ... }, function(){ ... } ], callback); //optional callback 

因此,线程1和线程2可以正确工作,而不会影响相同的代码或指令。 内容将会改变,而任何线程要求/的东西。


在执行过程中,实现(Reality)代码不是完全asynchronous的,有同步的部分有常见的动作,当他们需要调用asynchronous代码时。

同步:启动与容器 – >asynchronous:加载多个内容,并做一般的东西 – >同步:在屏幕上执行操作 – > …


案子

所以这里是我没有正常工作的代码:

 win.on('loaded', function() { $( "#ContentProgram" ).load( "view/launcherWorkSpace.html", function() { $("#bgLauncher").hide(); win.show(); async.parallel([ function() //**Background Process: Access to DB and return HTML content** { var datacontent = new data.GetActiveData(); var exeSQL = new data.conn(datacontent); if(exeSQL.Res) { var r = exeSQL.Content; if(r.Found) { logSalon = new data.activeSData(r) $('#RelativeInfo').empty(); $("#RelativeInfo").html("<h4 class='text-success'>Data found: <b>" + logData.getName + "</b></h4>"); } } }, function() //**Foreground Process: See an effect on screen during load.** { $("#bgLauncher").fadeIn(400); $("#centralAccess").delay(500).animate({bottom:0},200); } ]); }); }); 

正如你所看到的,即时通讯不使用“callback()”,因为我不需要(和它是一样的)。

即使后台进程没有完成,我也想做前台进程,但是当两个请求都完成的时候代码的结果是同时完成的。

如果我手动删除数据库,第一个函数需要3秒,直到发出exception(我不会处理)。 在此之前,这两个进程不会输出(在屏幕上显示)任何东西。 (前台进程应该启动后台进程发生的任何事情)。

感谢和抱歉,对于那些看起来很琐碎的东西,这么多的解释。


EDITED

这开始是烦人的…我尝试没有asynchronous,只是一个像这样的callbackJavaScript:

  launchEffect(function () { var datacontent = new data.GetActiveData(); var exeSQL = new data.conn(datacontent); if(exeSQL.Res) { var r = exeSQL.Content; if(r.Found) { logData = new data.activeData(r) $('#RelativeInfo').empty(); $("#RelativeInfo").html("<h4 class='text-success'>Salón: <b>" + log.getName + "</b></h4>"); } } }); }); }); function launchEffect(callback) { $("#bgLauncher").fadeIn(400); $("#centralAccess").delay(500).animate({bottom:0},200); callback(); } 

即使这个… jquery不工作,直到callback的答案…

node-webkit让我们运行代码为node.js编写代码,但最终只是运行在WebKit的Javascript运行时的一个垫片,只有一个线程,这意味着大多数“asynchronous”代码仍然会阻止其他代码的执行。

如果你本身运行node.js,你会看到不同的行为,因为它可以在幕后真正实现asynchronous线程。 如果你想要更多的线程,你需要在你的主机应用程序中提供它们。