[英]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.