Javascript Async的实际工作原理以及如何在node.js(node webkit)中正确使用它
对于这个问题,我正在使用(node.js)并加载一个Windows应用程序 这个问题的原因是为了明确回答: 在Javascript和Node.Js中,异步执行的真正含义是什么 问题的最后是我的个人密码问题。“案例”。 我将直接用一个概要来解释我遇到的所有问题。(我将在您帮助我了解信息时更新信息)Javascript Async的实际工作原理以及如何在node.js(node webkit)中正确使用它,javascript,jquery,node.js,asynchronous,node-webkit,Javascript,Jquery,Node.js,Asynchronous,Node Webkit,对于这个问题,我正在使用(node.js)并加载一个Windows应用程序 这个问题的原因是为了明确回答: 在Javascript和Node.Js中,异步执行的真正含义是什么 问题的最后是我的个人密码问题。“案例”。 我将直接用一个概要来解释我遇到的所有问题。(我将在您帮助我了解信息时更新信息) 概念(理论) 想象一个主屏幕(JS、Html、css,…Node.JS框架)和一个后台过程(JS每10分钟执行一次,JS内部检查,后台数据库优化,…) 无论您在主屏幕中做什么都不会影响后台执行(某些重
概念(理论) 想象一个主屏幕(JS、Html、css,…Node.JS框架)和一个后台过程(JS每10分钟执行一次,JS内部检查,后台数据库优化,…) 无论您在主屏幕中做什么都不会影响后台执行(某些重要情况除外),后台可以根据需要更改屏幕(屏幕计时器、有关联机web状态的信息等) 那么这种行为就像: 线程1:您在应用程序框架内的操作线程2:后台应用程序例程 任何操作完成后都会将其输出显示在屏幕上,尽管其他操作是异步并行的
解释(对我而言) 我认为作为并行执行,“异步”可以毫无问题地处理这个问题
async.parallel([
function(){ ... },
function(){ ... }
], callback); //optional callback
因此,线程1和线程2可以一起正确工作,而不会影响相同的代码或指令。
当任何线程请求内容时,内容将发生更改
实施(现实) 代码在执行过程中不是完全异步的,有一些带有通用操作的同步部分,当它们需要调用异步代码时 同步:使用容器启动->异步:加载多个内容并执行常规操作->同步:在屏幕中执行操作->
案例 所以这里是我工作不正常的代码:
win.on('loaded',function(){
$(“#ContentProgram”).load(“view/launcherWorkSpace.html”,function()){
$(“#bgLauncher”).hide();
win.show();
异步并行([
function()//**后台进程:访问数据库并返回HTML内容**
{
var datacontent=new data.GetActiveData();
var exeSQL=new data.conn(datacontent);
if(exeSQL.Res)
{
var r=exeSQL.Content;
如果(r.find)
{
logSalon=newdata.activeSData(r)
$('#RelativeInfo').empty();
$(“#RelativeInfo”).html(“找到的数据:+logData.getName+”);
}
}
},
function()//**前台进程:在加载期间查看屏幕上的效果**
{
$(“#bgLauncher”).fadeIn(400);
$(“#centralAccess”).delay(500).animate({bottom:0},200);
}
]);
});
});
正如你所看到的,我没有使用“Callback()”,因为我不需要(它也一样)
我想做前台进程,即使后台进程没有完成,但代码的结果是在两个请求都完成的同时完成的
如果我手动断开DB,第一个函数需要3秒钟,直到出现异常(我不会处理)。在此之前,两个进程都不会输出(在屏幕上显示)任何内容。(前台进程应该启动到后台进程)
感谢并抱歉为一些看起来微不足道的事情做了如此多的解释
已编辑 这开始让人讨厌了。。。我尝试了不使用Async的情况,只是一个带有回调的javascript,如下所示:
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();
}
launchEffect(函数(){
var datacontent=new data.GetActiveData();
var exeSQL=new data.conn(datacontent);
if(exeSQL.Res)
{
var r=exeSQL.Content;
如果(r.find)
{
logData=新数据。activeData(r)
$('#RelativeInfo').empty();
$(“#RelativeInfo”).html(“Salón:+log.getName+”);
}
}
});
});
});
函数launchEffect(回调)
{
$(“#bgLauncher”).fadeIn(400);
$(“#centralAccess”).delay(500).animate({bottom:0},200);
回调();
}
即使这样。。。Jquery在回调应答之前不会工作…
node webkit
让我们运行像node.js代码一样编写的代码,但最终只是webkit的Javascript运行时中运行的一个垫片,只有一个线程,这意味着大多数“异步”代码仍然会阻止任何其他代码的执行
如果您运行的是node.js本身,您会看到不同的行为,因为它可以在幕后执行真正的异步线程。如果您需要更多线程,则需要在主机应用程序中提供它们。因为您使用的是异步库。该并行调用将并行执行所有列出的函数是,但在处理回调之前,它将等待所有函数返回。事实上,您缺少异步并行最终回调,该回调在两个函数完成执行后处理结果或错误。另外,您的两个函数声明为sync,这不是您调用的回调。如果您查看异步文档,您应该会看到回调被使用,并且它们需要使用,因此您可以在每个函数完成时发出信号。在您的情况下,第一个函数处于“同步”状态,将等待完成。您仍在处理一个事件循环。如果您想保留此w/o回调,请将动画移动到第一个位置,因为它会执行并完成,然后发生DB调用。此外,Javascript不是多线程的,尤其是在浏览器端,除非您以编程方式使用web workers等。好吧,这是一个示例,它可以工作,但正如您所说,最后所有这些都可以一起工作。但在实际情况中,一个在后台每10分钟运行一次的api
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();
}