Javascript Async的实际工作原理以及如何在node.js(node webkit)中正确使用它

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内部检查,后台数据库优化,…) 无论您在主屏幕中做什么都不会影响后台执行(某些重

对于这个问题,我正在使用(node.js)并加载一个Windows应用程序

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

在Javascript和Node.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();
}