小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

wind.js助力異步編程 | 粉絲日志

 緣夢書摘 2015-06-13

從零開始nodejs系列文章,將介紹如何利Javascript做為服務(wù)端腳本,通過Nodejs框架web開發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome瀏覽器就基于V8,同時打開20-30個網(wǎng)頁都很流暢。Nodejs標準的web開發(fā)框架Express,可以幫助我們迅速建立web站點,比起PHP的開發(fā)效率更高,而且學(xué)習(xí)曲線更低。非常適合小型網(wǎng)站,個性化網(wǎng)站,我們自己的Geek網(wǎng)站?。?/p>

關(guān)于作者



  • 張丹(Conan), 程序員Java,R,PHP,Javascript

  • weibo:@Conan_Z

  • blog: http://blog.

  • email: bsspirit@gmail.com


轉(zhuǎn)載請注明出處:

http://blog./nodejs-async-windjs/


windjs


前言


Nodejs是一個單線程,異步,事件驅(qū)動的Javascript平臺架構(gòu),異步編程正是Nodejs的基礎(chǔ)。有時候我們需要做些同步的事情,程序?qū)懫饋砭蜁兊糜悬c麻煩。通常的解決辦法有2種,一種是設(shè)置setTimeout時間,這樣做會讓我們的程序掛住,無法執(zhí)行并發(fā)請求,另一種是callback嵌套,這樣做性能上沒有問題,但是代碼看上去會非常零散,增大維護的難度。


Wind.js是由國人開發(fā)的一款異步流程控制類庫,提供了一種“順序編寫、異步執(zhí)行”的操作。一旦你用上了,就一定不會放手的。


目錄



  1. Wind.js介紹

  2. Wind.js安裝

  3. 場景一:獨立事件,并行

  4. 場景二:依賴事件,串行

  5. 場景三:組合事件,并行+串行


1. Wind.js介紹


Wind.js是很有特點的一個JavaScript異步編程類庫(其前身為Jscex), Wind.js的唯一目的便是“改善編程體驗”,改善的“程度”以及改善的“方式”便是Wind.js與其他異步流程控制方案最大的區(qū)別。Wind.js的設(shè)計思路便是將這種抽象構(gòu)建為JavaScript本身。通過$await函數(shù)標識對代碼進行自動重寫,JIT編譯(Just in Time),從而避免人工的預(yù)編譯。


我們可以在github上面找到這個項目:https://github.com/JeffreyZhao/wind


2. Wind.js安裝


我的系統(tǒng)環(huán)境



  • win7: 64bit

  • npm: 1.2.19

  • node: v0.10.5


Wind.js安裝



~ D:\workspace\javascript>mkdir node-windjs
~ D:\workspace\javascript>cd node-windjs

D:\workspace\javascript\node-windjs>npm install wind
npm http GET https://registry./wind
npm http 200 https://registry./wind
npm http GET https://registry./wind/-/wind-0.7.3.tgz
npm http 200 https://registry./wind/-/wind-0.7.3.tgz
npm WARN package.json wind@0.7.3 No readme data!
wind@0.7.3 node_modules\wind

3. 場景一:獨立事件,并行


接下來我們要做的事情,會非常有意思。


定義3個函數(shù)A(),B(),C()

A():耗時3秒完成

B():耗時5秒完成

C():瞬時時完


A(),B(),C()為3個獨立事件,并行運行

stage1



var A = function(){
    setTimeout(function(){
        console.log("Finish A");
    },3000);
    console.log("Start A");
}

var B = function(){
    setTimeout(function(){
        console.log("Finish B");
    },5000);
    console.log("Start B");
}

var C = function(){
    console.log("Start C");
    console.log("Finish C");
}

A();
B();
C();

//結(jié)果 
Start A
Start B
Start C
Finish C
Finish A
Finish B

程序執(zhí)行沒有任何問題,按照執(zhí)行時間,打印出了Finish的順序:C,A,B


直接使用Javascript代碼,可以很好地完成功能。


4. 場景二:依賴事件,串行


A(),B(),C()串行

stage2


1). callback嵌套方式



var A = function(){
    setTimeout(function(){
        console.log("Finish A");
        B();
    },3000);
    console.log("Start A");
}

var B = function(){
    setTimeout(function(){
        console.log("Finish B");
        C();
    },5000);
    console.log("Start B");
}

var C = function(){
    console.log("Start C");
    console.log("Finish C");
}

A();

// 結(jié)果
Start A
Finish A
Start B
Finish B
Start C
Finish C

雖然,我們實現(xiàn)A,B,C串行的結(jié)果,但是代碼看起來就有些不好看了。B()的調(diào)入被嵌入到了A()函數(shù)中,C()的調(diào)用也被嵌入到的B()的函數(shù)中。如果我們的調(diào)用流程再長些,回調(diào)嵌套就會成為揮之不去的噩夢?。?!


2). Wind.js方式



var Wind = require("wind");
var Task =  Wind.Async.Task;

var A = eval(Wind.compile("async", function () {
    console.log("Start A");
    $await(Wind.Async.sleep(3000));
    console.log("Finish A");
}));

var B = eval(Wind.compile("async", function () {
    console.log("Start B");
    $await(Wind.Async.sleep(5000));
    console.log("Finish B");
}));

var C = eval(Wind.compile("async", function () {
    console.log("Start C");
    console.log("Finish C");
}));

var task = eval(Wind.compile("async", function () {
    $await(A());
    $await(B());
    $await(C());
}));
task().start();

//結(jié)果 
Start A
Finish A
Start B
Finish B
Start C
Finish C

結(jié)果就是我們想要的,我們是按照$await(A()),$await(B()),$await(C())的順序定義的,而且順序執(zhí)行的。比起callback嵌套方式的,大有改觀,更便于以后的代碼維護。


5. 場景三:組合事件,并行+串行


先A(),B()并行,都完成后再運行C()

stage3


1). callback嵌套方式

同時,引入一個全局變量stat,判斷A,B的完成情況。



var A = function(){
    setTimeout(function(){
        console.log("Finish A");
        if(++stat == 2) C();
    },3000);
    console.log("Start A");
}

var B = function(){
    setTimeout(function(){
        console.log("Finish B");
        if(++stat == 2) C();
    },5000);
    console.log("Start B");
}

var C = function(){
    console.log("Start C");
    console.log("Finish C");
}

var stat=0;
A();
B();

//結(jié)果
Start A
Start B
Finish A
Finish B
Start C
Finish C

雖然實現(xiàn)功能,但代碼已經(jīng)混亂了。我相信大部分人都不愿意去維護這樣的代碼的。


2). Wind.js方式



var Wind = require("wind");
var Task =  Wind.Async.Task;

var A = eval(Wind.compile("async", function () {
    console.log("Start A");
    $await(Wind.Async.sleep(3000));
    console.log("Finish A");
}));

var B = eval(Wind.compile("async", function () {
    console.log("Start B");
    $await(Wind.Async.sleep(5000));
    console.log("Finish B");
}));

var C = eval(Wind.compile("async", function () {
    console.log("Start C");
    console.log("Finish C");
}));

var task = eval(Wind.compile("async", function () {
    $await(Task.whenAll(A(),B()));
    $await(C());
}));
task().start();

//結(jié)果
Start A
Start B
Finish A
Finish B
Start C
Finish C

wind.js又一次拯救我們的代碼,這樣的代碼有章有法,看起來才舒服。


wind.js幫助我們很好地規(guī)范了異步編程,用過了,你還舍得放棄嗎?


轉(zhuǎn)載請注明出處:

http://blog./nodejs-async-windjs/










1


             
                           

This entry was posted in Javascript語言實踐

              
           

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多