摘要:函數(shù)最簡(jiǎn)單,不需要借助其他的執(zhí)行器即可按照順序執(zhí)行。函數(shù)執(zhí)行過程中遇到就會(huì)交出執(zhí)行權(quán)限,等到異步操作完成再進(jìn)行下面的操作,語(yǔ)句返回的是方法的參數(shù)。小程序不支持函數(shù),并且同時(shí)間最多支持個(gè)請(qǐng)求,所以被迫無(wú)奈,只能使用來做異步批量調(diào)用。
在日常開發(fā)的過程中總會(huì)遇到一些下一個(gè)請(qǐng)求需要上一個(gè)請(qǐng)求的響應(yīng)數(shù)據(jù)作為參數(shù)(或者坑爹的小程序開發(fā)只能同時(shí)最多請(qǐng)求5個(gè)),那么這個(gè)時(shí)候我們就需要批量地請(qǐng)求一批后再請(qǐng)求一批。
Async函數(shù)首先來介紹一下Async函數(shù)方式,Async函數(shù)是ES7添加的,目前babel方面已支持,所以可以大膽使用。Async函數(shù)最簡(jiǎn)單,不需要借助其他的執(zhí)行器即可按照順序執(zhí)行。下面來看個(gè)例子。
// 正常情況下,await命令后面是一個(gè) Promise 對(duì)象。如果不是,會(huì)被轉(zhuǎn)成一個(gè)立即resolve的 Promise 對(duì)象。 async function requestList() { let res1 = await new Promise((resolve) => { setTimeout(() => { resolve("ok"); }, 100); }); let res2 = await new Promise((resolve) => { setTimeout(() => { resolve("ok2"); }, 100); }); } var promise = requestList();
Async函數(shù)執(zhí)行過程中遇到await就會(huì)交出執(zhí)行權(quán)限,等到異步操作完成再進(jìn)行下面的操作,await 語(yǔ)句返回的是Promise resolve方法的參數(shù)。
Genrator函數(shù)Genrator函數(shù)比起Async函數(shù)就像是Async函數(shù)是Genrator的語(yǔ)法糖,我們來看一下。
function* gen(){ try { let a = yield new Promise(); let b = yield new Promise(); let c = yield new Promise(); } catch (e) { console.log("e"); } yield console.log("c"); } let g = gen();
執(zhí)行Generator函數(shù)不會(huì)像Async函數(shù)那樣自動(dòng)執(zhí)行全部異步操作,而是返回一個(gè)執(zhí)行器,這個(gè)執(zhí)行器有next/throw/return三個(gè)方法可以讓Generator函數(shù)里動(dòng)起來。如果我們想要向Async函數(shù)那樣不用自己next next next無(wú)止境地調(diào)用,那么我們需要一個(gè)自動(dòng)執(zhí)行的方法。
function go(gen) { var g = gen(); next(g.next()); function next(res) { if (res.done) return value; res.value.then((data) => { next(g.next(data)); }).catch((err) => { console.error(err); next(g.throw(err)); }); } }Promise
小程序不支持Generator函數(shù),并且同時(shí)間最多支持5個(gè)請(qǐng)求,所以被迫無(wú)奈,只能使用Promise來做異步批量調(diào)用。
因?yàn)閷?shí)例化一個(gè)Promise對(duì)象就會(huì)馬上進(jìn)行異步操作,所以以下的方式是不行的
let res1 = new Promise(); let res2 = new Promise(); let res3 = new Promise(); let res4 = new Promise();
四個(gè)異步操作是同時(shí)進(jìn)行而不是一個(gè)接一個(gè)進(jìn)行,現(xiàn)在我們要同步化這些異步操作怎么做呢?
function goPromise(arr) { var index = 0; run(ajax(arr[index])); function run(p) { index++; p.then((data) => { console.log(data); if (index < arr.length) { run(ajax(arr[index])); } }).catch((err) => { console.error(err); if (index < arr.length) { run(ajax(arr[index])); } }); } }
很明顯就有個(gè)弊端,使用promise遞歸執(zhí)行異步操作的時(shí)候,處理數(shù)據(jù)的邏輯需要放在遞歸函數(shù)里,就沒有Generator函數(shù)舒服了,但是有什么辦法呢,小程序又不支持Generator函數(shù),又不想引入墊片,就這樣做啦。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88459.html
摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。 JS異步之Promise,Generator,Async Promise 解決的問題:回調(diào)地獄 Promise規(guī)范: promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從...
摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。 JS異步之Promise,Generator,Async Promise 解決的問題:回調(diào)地獄 Promise規(guī)范: promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從...
摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。 JS異步之Promise,Generator,Async Promise 解決的問題:回調(diào)地獄 Promise規(guī)范: promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從...
摘要:示例運(yùn)行函數(shù)彈出彈出函數(shù)接收參數(shù),返回值。其中,返回一個(gè)對(duì)象,是的返回值,代表函數(shù)是否執(zhí)行完成。 ES6特性介紹(下) ES6新的標(biāo)準(zhǔn),新的語(yǔ)法特征:1、變量/賦值2、函數(shù)3、數(shù)組/json4、字符串5、面向?qū)ο?、Promise7、generator8、ES7:async/await 《【W(wǎng)eb全棧課程二】ES6特性介紹(上)》見:https://segmentfault.com/a...
閱讀 813·2021-11-18 10:02
閱讀 2504·2021-11-11 16:54
閱讀 2750·2021-09-02 09:45
閱讀 654·2019-08-30 12:52
閱讀 2774·2019-08-29 14:04
閱讀 2745·2019-08-29 12:39
閱讀 448·2019-08-29 12:27
閱讀 1887·2019-08-26 13:23