異步的發(fā)展

發(fā)展過(guò)程

  • callback -> promise -> genrator + co -> async + await(語(yǔ)法糖)

異步是不支持try/catch的,try/catch只在同步中使用

node支持異步

// 1.txt -> 周杰倫
// 2.txt -> 七里香
// node里內(nèi)置的fs方法
const fs = require('fs');

fs.readFile('1.txt', 'utf8', function (err, data) {
    fs.readFile(data, 'utf8', function (err, data) {
        console.log(data);
    });
});

高階函數(shù)

  • 定義: 函數(shù)可以作為參數(shù)or函數(shù)可以作為返回值
    來(lái)實(shí)現(xiàn)個(gè)判斷數(shù)據(jù)類(lèi)型的isType函數(shù)
function isType(type, value) {
  return Object.prototype.toString.call(value) === `[object ${type}]`;
}
console.log(isType('String', 'hello'));  // true
console.log(isType('Array', ['hi', 1, 2]));  // true
console.log(isType('Function', function (){});  // true

上面的isType函數(shù)雖然可以實(shí)現(xiàn)數(shù)據(jù)類(lèi)型的判斷,但是每次都要傳遞多余的參數(shù),這樣寫(xiě)起來(lái)很麻煩,其實(shí)下面還有更好的方法來(lái)減少參數(shù)
改良后的isType如下:

// 批量生產(chǎn)函數(shù)
function isType(type) {  // 偏函數(shù)  先預(yù)置進(jìn)去
    return function(value) {
        return Object.prototype.toString.call(value) === `[object ${type}]`;
    }
}

const isArray = isType('Array');    // 判斷數(shù)組
const isString = isType('String');  // 判斷字符串
console.log(isArray([222]));         // true

像批量生產(chǎn)函數(shù)的這種實(shí)現(xiàn),還有一種就是預(yù)置函數(shù),預(yù)置函數(shù)的實(shí)現(xiàn)原理很簡(jiǎn)單,當(dāng)達(dá)到條件時(shí)再執(zhí)行回調(diào)函數(shù),像lodash里的after方法一樣

function after(time, cb) {
    return function() {
        if (--time === 0) {
            cb();
        }
    }
}
// 舉個(gè)栗子吧,吃飯的時(shí)候,我很能吃,吃了三碗才能吃飽
let eat = after(3, function() {
    console.log('吃飽了');
});
eat();
eat();
eat();
// 只有執(zhí)行三次吃的函數(shù)才會(huì)觸發(fā)‘吃飽了’

前面說(shuō)了好多別的,有點(diǎn)跑題了,繼續(xù)回來(lái)說(shuō)異步的事
我現(xiàn)在還是有兩個(gè)文件,我要用fs去讀取,然后異步的問(wèn)題就來(lái)了,我怎么知道哪個(gè)先讀完,哪個(gè)后讀完。
好吧,其實(shí)我也不關(guān)心,我關(guān)心的是我要怎么拿到這兩個(gè)文件里的數(shù)據(jù)
說(shuō)下我的思路吧
一開(kāi)始想直接放個(gè)數(shù)組來(lái)存取每次讀到的數(shù)據(jù),但這個(gè)放在同步情況下沒(méi)問(wèn)題
異步就不行了,我畢竟不知道哪個(gè)先讀取完,這個(gè)過(guò)程是無(wú)法判斷的
于是乎想到了個(gè)最簡(jiǎn)單的方法,得利用函數(shù)了,把數(shù)據(jù)當(dāng)做參數(shù)傳過(guò)去

// 寫(xiě)一個(gè)輸出數(shù)據(jù)的函數(shù)
let arr = [];
function out(data) {
    arr.push(data);
    if (arr.length === 2) {
        console.log(arr);    // ['周杰倫', '七里香']
    }
}

fs.readFile('1.txt', 'utf8', function(err, data)  {
    out(data);
});
fs.readFile('2.txt', 'utf8', function(err, data)  {
    out(data);
});

以上代碼確實(shí)實(shí)現(xiàn)了把讀取的數(shù)據(jù)都拿到了
But還是有些小缺陷,out里面的數(shù)字2是寫(xiě)死的
如果又多了一個(gè)文件讀取,那就得改成3了,這很不夠酷
那么,怎樣改比較好呢,還記得上面實(shí)現(xiàn)的after函數(shù)吧
現(xiàn)在來(lái)看看它的用處吧

// 用after函數(shù)去改造一下out函數(shù)
let out = after(2, function(arr) {
    console.log(arr);
});

function after(time, cb) {
    // result被引用了,形成了閉包,不會(huì)被回收掉
    let result = [];
    return function(data) {
        result.push(data);
        if (--time === 0) {
            cb(result);      // 可以緩存函數(shù),當(dāng)?shù)竭_(dá)條件時(shí)執(zhí)行
        }
    }
}

fs.readFile('1.txt', 'utf8', function(err, data)  { out(data); });
fs.readFile('2.txt', 'utf8', function(err, data)  { out(data); });

雖然after方法已經(jīng)很好了,但是我們不能每次處理異步請(qǐng)求的時(shí)候,都手寫(xiě)一遍after函數(shù),這不科學(xué),不合理
SO因此我們用上了promise

promise

從實(shí)際開(kāi)發(fā)中,promise解決了回調(diào)地獄的問(wèn)題,不會(huì)導(dǎo)致難以維護(hù)
then可以按照順序執(zhí)行
羅里吧嗦了一堆,終于進(jìn)入主題了,想來(lái)時(shí)間也不晚了,還是洗洗睡吧
未完待續(xù),這里有后續(xù)可看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語(yǔ)言太重要。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,404評(píng)論 5 22
  • 你不知道JS:異步 第三章:Promises 接上篇3-1 錯(cuò)誤處理(Error Handling) 在異步編程中...
    purple_force閱讀 1,495評(píng)論 0 2
  • 本文適用的讀者 本文寫(xiě)給有一定Promise使用經(jīng)驗(yàn)的人,如果你還沒(méi)有使用過(guò)Promise,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,454評(píng)論 6 19
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 8,775評(píng)論 0 29
  • 一夜思瘦為佳顏,病榻輾轉(zhuǎn)是難眠。 起身醉飲吟詩(shī)篇,句句珍藏昨日天。 手撫紅顏吻千遍,酒醒方知人不見(jiàn)。 淚灑憔悴孤獨(dú)...
    始之居士閱讀 287評(píng)論 17 7

友情鏈接更多精彩內(nèi)容