国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

閑談異步調(diào)用“扁平”化

Jaden / 3127人閱讀

摘要:而的主線程中不允許操作網(wǎng)絡(luò),更是將程序員們推向了異步的深淵。異步深淵產(chǎn)生的主要原因是回調(diào),這在里尤其嚴(yán)重。為了逃離回調(diào)的深淵,大家開始想各種辦法來把回調(diào)扁平化。目前已經(jīng)在等環(huán)境中得到支持,使用的不僅能大大簡化代碼,還能降低邏輯思路的復(fù)雜度。

哦,代碼……就把它們當(dāng)成插圖吧

隨著 CPU 從單核變多核,軟件從注重功能到注重體驗,Web 從頁面跳轉(zhuǎn)方式到 Web2.0 的無刷新加載(AJAX),程序員越來越多的接觸多線程和異步。而 Android 的主線程中不允許操作網(wǎng)絡(luò),更是將程序員們推向了異步的深淵。異步深淵產(chǎn)生的主要原因是回調(diào),這在 nodejs 里尤其嚴(yán)重。

// [node.js]

doFirstThing(function(err, data) {
    doSecondThing(data, function(err, data) {
        doThirdThing(data, function(err, data) {
            // ... fall down
        })
    });
});

為了逃離回調(diào)的深淵,大家開始想各種辦法來把回調(diào)扁平化。

在 JavaScript 中,Promise(指該類方法而非某個庫)成為眾多解決方案的佼佼者,并成功被 ES6 采納。

// [node.js]

doFirstThing()
    .then(doSecondThing)
    .then(doThirdThing)
    // .then(...) - continuous
    .catch(function() {
        // something wrong
    });

而 C# 則通過 Task 和 ThreadPool 讓異步編程變得容易。前面談?wù)摰?C# 并行計算(Parallel 和 ParallelQuery) 就是基于 Task 的。不過使用 Task.ContinueWith()Parallel.ForEach() 的時候,就會覺得:這不就是 Promise 嗎?

// [csharp]

Task.Run(() => {
    // do first thing and return a data
    return "first";
}).ContinueWith(task => {
    // do second thing and return a data
    return new []{ task.Result, "second" };
}).ContinueWith(task => {
    // do final thing
    foreach (string s in task.Result) { Console.WriteLine(s); }
}).Wait();

之后 C#5.0 又推出 async/await 方案,將異步代碼寫得像同步代碼一樣,由編譯器來將 async/await 代碼封裝成異步 Task 方式,而不是由人工處理,這大大降低了寫異步程序的門檻。

// [csharp]

private async static Task Process() {
    string first = await Task.Run(() => "first");
    string[] all = await Task.Run(() => {
        return new [] { first, "second" };
    });
    
    await(Task.Run(() => {
        foreach (string s in all) { Console.WriteLine(s); }
    }));
}

JavaScript 程序員們一邊在等著 ES7 的 async/await 特性,一邊也沒閑著,在 ES6 generator/yield 特性基礎(chǔ)上開發(fā)了個 co 出來,提供了類似于 async/await 特性的異步編程方式。

// [node.js]

var co = require("co");

co(function*() {
    var first = yield new Promise(function(resolve) {
        setTimeout(function() {
            resolve("first");
        }, 100);
    });

    var all = yield new Promise(function(resolve) {
        setTimeout(function() {
            resolve([first, "second"])
        }, 200);
    })

    console.log(all);
});

// [ "first", "second" ]

不過 co 程序?qū)懫饋碛忠獙?Generator,又要用 yeild,還常常要封裝 Promise,代碼仍然不夠簡潔。目前 async/await 已經(jīng)在 TypeScript、Babel、Node 7.6+ 等環(huán)境中得到支持,使用 JavaScript 的 async/await 不僅能大大簡化代碼,還能降低邏輯思路的復(fù)雜度。

2018.1.18 更新,因為 async/await 早已進(jìn)入實踐階段

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85974.html

相關(guān)文章

  • 從小小題目逐步走進(jìn) JavaScript 異步調(diào)用

    摘要:問題的主要目的是考察對異步調(diào)用執(zhí)行結(jié)果的處理,既然是異步調(diào)用,那么不可能同步等待異步結(jié)果,結(jié)果一定是異步的經(jīng)常用來模擬異步操作。 問題 原題來自 @若澤 的提問。 可修改下面的 aa() 函數(shù),目的是在一秒后用 console.log() 輸出 want-value function aa() { setTimeout(function() { return w...

    AprilJ 評論0 收藏0
  • 前后分離模型之封裝 Api 調(diào)用

    摘要:和異步處理調(diào)用訪問數(shù)據(jù)采用的方式,這是一個異步過程,異步過程最基本的處理方式是事件或回調(diào),其實這兩種處理方式實現(xiàn)原理差不多,都需要在調(diào)用異步過程的時候傳入一個在異步過程結(jié)束的時候調(diào)用的接口。 Ajax 和異步處理 調(diào)用 API 訪問數(shù)據(jù)采用的 Ajax 方式,這是一個異步過程,異步過程最基本的處理方式是事件或回調(diào),其實這兩種處理方式實現(xiàn)原理差不多,都需要在調(diào)用異步過程的時候傳入一個在異...

    trilever 評論0 收藏0
  • 理解 JavaScript 的 async/await

    摘要:因為函數(shù)返回一個對象,所以可以用于等待一個函數(shù)的返回值這也可以說是在等函數(shù),但要清楚,它等的實際是一個返回值。幫我們干了啥作個簡單的比較上面已經(jīng)說明了會將其后的函數(shù)函數(shù)表達(dá)式或的返回值封裝成一個對象,而會等待這個完成,并將其的結(jié)果返回出來。 隨著 Node 7 的發(fā)布,越來越多的人開始研究據(jù)說是異步編程終級解決方案的 async/await。我第一次看到這組關(guān)鍵字并不是在 JavaSc...

    tracymac7 評論0 收藏0
  • redux 閑談

    摘要:使用中間件后的也是通過中間件包裝后的。在的位置則進(jìn)行觸發(fā)監(jiān)聽器,監(jiān)聽器設(shè)置則在中增加?,F(xiàn)在來解釋,和對應(yīng)關(guān)系我當(dāng)時回答的是對應(yīng)的函數(shù)名稱,如果一致的話就會執(zhí)行。呵呵,那個涂鴉大工程師有問題了如何綁定的呢,怎么確定是而不是。 redux 閑談 起因: 在與涂鴉智能一個web工程師交流過程中,他詢問我dispatch一個action,是如何和reducer 綁定的,dispatch(act...

    levius 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<