簡體   English   中英

異步的真正工作原理以及如何與node.js正確使用(node-webkit)

[英]How Async really works and How to use it properly with node.js (node-webkit)

對於這個問題,我正在使用Node-Webkit (node.js)和Async ,正在加載Windows應用程序。

這個問題的原因是要明確回答:

在Javascript和Node.Js中真正意味着異步執行。

我的個人代碼問題在問題的末尾。 “案子”。

我將直接用原理圖摘要解釋所有有關該問題的信息。 (而且我會在您幫助我了解信息時對其進行更新)


概念(理論)

想象一下一個主屏幕(JS,Html,css,... Node.js框架)和一個后台過程(每10分鍾執行一次JS,JS內部檢查,后台數據庫優化等)。

您在“主屏幕”中所做的任何操作都不會影響后台執行(某些重要情況除外),並且如果他需要,后台甚至可以更改屏幕(屏幕計時器,有關在線網絡狀態的信息,等等)。

那么行為就像:

線程1: 您在App框架內的操作。 線程2: 后台應用程序

盡管完成了異步並行中的其余操作,但完成的任何操作都會將其輸出顯示在屏幕上


解釋(對我來說)

我認為這是“異步”將作為並行執行毫無問題地處理的事情。

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

因此,線程1和線程2可以在不影響相同代碼或指令的情況下正確地協同工作。 當任何線程向其請求某些內容時,內容將發生變化。


實施(Reality)代碼在執行期間不是完全異步的,其中有些同步部分具有常見的操作,需要在需要時調用異步代碼。

同步:使用容器啟動->異步:加載多個內容並執行常規操作->同步:在屏幕上執行操作-> ...


案子

所以這是我無法正常工作的代碼:

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秒鍾,直到出現異常(我不會處理)。 在此之前,兩個過程都不​​會輸出任何東西(顯示在屏幕上)。 (無論后台進程發生什么,都應該啟動前台進程)。

感謝和抱歉,為如此瑣碎的事物提供了太多解釋。


EDITED

這開始很煩人。。。我試過沒有異步,只是一個帶有回調的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();
}

即使這樣... jQuery直到回調答案才起作用...

node-webkit讓您運行類似於node.js的代碼,但最終只是在WebKit的Javascript運行時中運行的填充程序,並且只有一個線程,這意味着大多數“異步”代碼仍將阻止其他任何代碼的執行。

如果您運行的是node.js本身,則會看到不同的行為,因為它可以在后台進行真正的異步線程處理。 如果需要更多線程,則需要在主機應用程序中提供它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM