摘要:而的主線程中不允許操作網(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
摘要:問題的主要目的是考察對異步調(diào)用執(zhí)行結(jié)果的處理,既然是異步調(diào)用,那么不可能同步等待異步結(jié)果,結(jié)果一定是異步的經(jīng)常用來模擬異步操作。 問題 原題來自 @若澤 的提問。 可修改下面的 aa() 函數(shù),目的是在一秒后用 console.log() 輸出 want-value function aa() { setTimeout(function() { return w...
摘要:和異步處理調(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)用異步過程的時候傳入一個在異...
摘要:因為函數(shù)返回一個對象,所以可以用于等待一個函數(shù)的返回值這也可以說是在等函數(shù),但要清楚,它等的實際是一個返回值。幫我們干了啥作個簡單的比較上面已經(jīng)說明了會將其后的函數(shù)函數(shù)表達(dá)式或的返回值封裝成一個對象,而會等待這個完成,并將其的結(jié)果返回出來。 隨著 Node 7 的發(fā)布,越來越多的人開始研究據(jù)說是異步編程終級解決方案的 async/await。我第一次看到這組關(guān)鍵字并不是在 JavaSc...
閱讀 1123·2023-04-26 00:12
閱讀 3249·2021-11-17 09:33
閱讀 1061·2021-09-04 16:45
閱讀 1186·2021-09-02 15:40
閱讀 2146·2019-08-30 15:56
閱讀 2951·2019-08-30 15:53
閱讀 3548·2019-08-30 11:23
閱讀 1932·2019-08-29 13:54