ES6利用generator,promise實(shí)現(xiàn)異步操作變同步

寫在前面的話:

? ? ? ?由于js是單線程的,為了在瀏覽器的交互過程中,不阻塞,提供了異步操作的特性。但是我們?cè)趈s編程中可能會(huì)遇到這樣一種情況:需要等待一個(gè)異步操作執(zhí)行完,并返回結(jié)果,也即是阻塞住當(dāng)前代碼執(zhí)行,接下來的代碼根據(jù)結(jié)果繼續(xù)往下執(zhí)行。

?? ? ?之前在工作中的項(xiàng)目中切實(shí)有這種需求,在一個(gè)文件上傳模塊中,需要計(jì)算上傳文件的md5(文件越大,耗時(shí)越長(zhǎng)),需要在js中hold住計(jì)算,然后將取到的md5傳遞給下面的代碼。最初對(duì)js不甚了解,導(dǎo)致計(jì)算md5總是異步出去操作了,沒有在js的當(dāng)次循環(huán)中執(zhí)行完成,最后用回調(diào)函數(shù)解決了。

? ? ? ?后來看了ES6語法,js新標(biāo)準(zhǔn)提供了諸如generator,promise等新特性,發(fā)現(xiàn)我的這種需求可以用更加簡(jiǎn)潔的方式實(shí)現(xiàn)。下面的例子用到了es6提供的箭頭函數(shù)(匿名函數(shù)的簡(jiǎn)單寫法),generator函數(shù),和promise函數(shù)。

例子:

var a_timeout = () =>{

return new Promise(function (resolve,reject){

setTimeout(function(callback){

console.log('a_timeout start');

console.log('This is a_timeout');

callback('a');

},5000,resolve)

})

};

var b_timeout = function(a_result){

console.log('b_timeout start');

console.log(a_result);

return new Promise(function (resolve,reject){

setTimeout(function(callback){

console.log('This is b_timeout');

callback('b');

},3000,resolve)

})

}

var gen = function* (){

var a_r = yield a_timeout();

var b_r = yield b_timeout(a_r);

};

function run(gen){

var g = gen();

function next(data){

var result = g.next(data);

if (result.done) return result.value;

result.value.then(function(data){

next(data);

});

}

next();

}

run(gen);

輸出:

a_timeout start

This is a_timeout

b_timeout start

a

This is b_timeout

結(jié)果和我想象中的一樣,按照預(yù)先的順序執(zhí)行了a_async,b_async.

而不是想之前在js中一樣,a_async和b_async同時(shí)開始運(yùn)行,b_async取不到a_async的值


相關(guān)資料:http://es6.ruanyifeng.com/#docs/async

最后編輯于
?著作權(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)容

  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,886評(píng)論 0 5
  • Promise in js 回調(diào)函數(shù)真正的問題在于他剝奪了我們使用 return 和 throw 這些關(guān)鍵字的能力...
    _Struggle_閱讀 306評(píng)論 0 0
  • 不支持上傳文件,所以就復(fù)制過來了。作者信息什么的都沒刪。對(duì)前端基本屬于一竅不通,所以沒有任何修改,反正用著沒問題就...
    全棧在路上閱讀 2,070評(píng)論 0 2
  • 游戲,是一個(gè)很奇妙的存在,有些人,沉迷其中,不能自拔;也有些人,壓根兒提不起興趣。 我是一個(gè)比較喜歡玩游戲的人,特...
    潛意識(shí)里的閱讀 613評(píng)論 1 1
  • 你希望過上又閑又美的生活嗎? 我想,這應(yīng)該是大多數(shù)人的美好愿望! 首先,分享一位年輕的榜樣:張萌萌姐,她是:又忙又...
    陳少瓊閱讀 268評(píng)論 5 8

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