javascript異步發(fā)展史

js中的異步是指一個(gè)函數(shù)在執(zhí)行過(guò)程中,其中一部分不能馬上執(zhí)行完畢,然后執(zhí)行函數(shù)體中另外一部分。等到第一部分得到返回值再執(zhí)行第二部分。

1.回調(diào)函數(shù)callback

無(wú)法捕獲錯(cuò)誤 try catch

不能return

回調(diào)地獄

? function personInfo(callback){

? ? $.ajax({

? ? ? ? ? type: "GET",

? ? ? ? ? url: "test.json",?

? ? ? ? ? data: {

? ? ? ? ? ? ? ? username:username,

? ? ? ? ? ? ? ? content:content

? ? ? ? ? },

? ? ? ? dataType: "json",

? ? ? ? success: function(data){

? ? ? ? ? ? ? if(data.length>0){

? ? ? ? ? ? ? ? ? ? callback&&callback();

? ? ? ? ? ? ? }

? ? ? ? }

? });

}

2.事件發(fā)布/訂閱模型

給一個(gè)事件,訂閱幾個(gè)方法,方法依次執(zhí)行。

function Event() {

? ? this.event = {};

}

Event.prototype.on = function (type,callBack) {

? ? if(this.event[type]){

? ? ? ? this.event[type].push(callBack);

? ? }else{

? ? ? ? this.event[type] = [callBack];

? ? }

};

Event.prototype.emit = function (type,...data) {

? ? this.event[type].forEach((item)=>item(...data));

};

let event = new Event();

function fn1(){

? console.log('吃飯');

}

function fn2(){

? ? console.log('工作');

}

event.on('我的一天',fn1);

event.on('我的一天',fn2);

event.emit('我的一天');

3.Promise異步函數(shù)解決方案

? A執(zhí)行完執(zhí)行B,B執(zhí)行完執(zhí)行C。把A的返回值給B再給C

每一次執(zhí)行,返回一個(gè)新的Promise實(shí)例(鏈?zhǔn)秸{(diào)用)

? 代碼易讀

let p1 = new Promise(function(resolve,reject){

? reject(10000000);

});

p1.then(function(value){

? console.log('成功1=',value);

},function(reason){

? console.log('失敗1=',reason);

});

p1.then(function(value){

? console.log('成功2=',value);

},function(reason){

? console.log('失敗2=',reason);

});

4.Generator生成器函數(shù)

調(diào)用一個(gè)生成器函數(shù)它不會(huì)立刻執(zhí)行

它返回一個(gè)迭代器函數(shù),每調(diào)用一次next就可以返回一個(gè)值對(duì)象

function *go(a){

? ? console.log(1);

? ? let b =? yield a;

? ? console.log(2);

? ? let c = yield b;

? ? console.log(3);

? ? return c;

}

let it = go("a值");

let r1 = it.next();

let r2 = it.next('B值');

5.Co

co是一個(gè)為Node.js和瀏覽器打造的基于生成器的流程控制工具,借助于Promise,你可以使用更加優(yōu)雅的方式編寫非阻塞代碼。

let fs = require('fs');

function readFile(filename) {

? return new Promise(function (resolve, reject) {

? ? fs.readFile(filename, function (err, data) {

? ? ? if (err)

? ? ? ? reject(err);

? ? ? else

? ? ? ? resolve(data);

? ? })

? })

}

function *read() {

? let template = yield readFile('./template.txt');

? let data = yield readFile('./data.txt');

? return template + '+' + data;

}

co(read).then(function (data) {

? console.log(data);

}, function (err) {

? console.log(err);

});

function co(gen) {

? let it = gen();

? return new Promise(function (resolve, reject) {

? ? !function next(lastVal) {

? ? ? let {value, done} = it.next(lastVal);

? ? ? if (done) {

? ? ? ? resolve(value);

? ? ? } else {

? ? ? ? value.then(next, reason => reject(reason));

? ? ? }

? ? }();

? });

}

6.Async/ await

可以實(shí)現(xiàn)和co一樣的功能

結(jié)構(gòu)簡(jiǎn)單,可讀性強(qiáng)

let fs = require('fs');

function readFile(filename) {

? return new Promise(function (resolve, reject) {

? ? fs.readFile(filename, 'utf8', function (err, data) {

? ? ? if (err)

? ? ? ? reject(err);

? ? ? else

? ? ? ? resolve(data);

? ? })

? })

}

async function read() {

? let template = await readFile('./template.txt');

? let data = await readFile('./data.txt');

? return template + '+' + data;

}

let result = read();

result.then(data=>console.log(data));

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,837評(píng)論 1 56
  • 歡迎閱讀專門探索 JavaScript 及其構(gòu)建組件的系列文章的第四章。 在識(shí)別和描述核心元素的過(guò)程中,我們還分享...
    OSC開源社區(qū)閱讀 1,220評(píng)論 1 10
  • 在ES6當(dāng)中添加了很多新的API其中很值得一提的當(dāng)然少不了Promise,因?yàn)镻romise的出現(xiàn),很輕松的就給開...
    嘿_那個(gè)誰(shuí)閱讀 3,752評(píng)論 2 3
  • 前言 本文旨在簡(jiǎn)單講解一下javascript中的Promise對(duì)象的概念,特性與簡(jiǎn)單的使用方法。并在文末會(huì)附上一...
    _暮雨清秋_閱讀 2,315評(píng)論 0 3
  • 特點(diǎn) Promise能將回調(diào)分離出來(lái),在異步操作執(zhí)行之后,用鏈?zhǔn)椒椒▓?zhí)行回調(diào),雖然es5用封裝函數(shù)也能實(shí)現(xiàn),但是如...
    一二三kkxx閱讀 717評(píng)論 0 1

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