本篇文章為大家展示了Promise中怎么實(shí)現(xiàn)異步串行執(zhí)行,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)薩嘎,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
按照要求:
實(shí)現(xiàn) mergePromise 函數(shù),把傳進(jìn)去的函數(shù)數(shù)組按順序先后執(zhí)行,并且把返回的數(shù)據(jù)先后放到數(shù)組 data 中。
代碼如下:
const timeout = ms => new Promise((resolve, reject) => {setTimeout(() => {resolve();}, ms);});const ajax1 = () => timeout(2000).then(() => {console.log('1');return 1;});const ajax2 = () => timeout(1000).then(() => {console.log('2');return 2;});const ajax3 = () => timeout(2000).then(() => {console.log('3');return 3;});const mergePromise = ajaxArray => {// 在這里實(shí)現(xiàn)你的代碼};mergePromise([ajax1, ajax2, ajax3]).then(data => {console.log('done');console.log(data); // data 為 [1, 2, 3]});// 要求分別輸出// 1// 2// 3// done// [1, 2, 3]
分析:
timeout是一個(gè)函數(shù),這個(gè)函數(shù)執(zhí)行后返回一個(gè)promise實(shí)例。
ajax1 、ajax2、ajax3 都是函數(shù),不過這些函數(shù)有一些特點(diǎn),執(zhí)行后都會(huì)會(huì)返回一個(gè) 新的promise實(shí)例。
按題目的要求我們只要順序執(zhí)行這三個(gè)函數(shù)就好了,然后把結(jié)果放到 data 中,但是這些函數(shù)里都是異步操作,想要按順序執(zhí)行,然后輸出 1,2,3并沒有那么簡單,看個(gè)例子。
function A() {setTimeout(function () {console.log('a');}, 3000);}function B() {setTimeout(function () {console.log('b');}, 1000);}A();B();// b// a
例子中我們是按順序執(zhí)行的 A,B 但是輸出的結(jié)果卻是 b,a 對于這些異步函數(shù)來說,并不會(huì)按順序執(zhí)行完一個(gè),再執(zhí)行后一個(gè)。
這道題主要考察的是Promise 控制異步流程,我們要想辦法,讓這些函數(shù),一個(gè)執(zhí)行完之后,再執(zhí)行下一個(gè),代碼如何實(shí)現(xiàn)呢?
// 保存數(shù)組中的函數(shù)執(zhí)行后的結(jié)果var data = [];// Promise.resolve方法調(diào)用時(shí)不帶參數(shù),直接返回一個(gè)resolved狀態(tài)的 Promise 對象。var sequence = Promise.resolve();ajaxArray.forEach(function (item) {// 第一次的 then 方法用來執(zhí)行數(shù)組中的每個(gè)函數(shù),// 第二次的 then 方法接受數(shù)組中的函數(shù)執(zhí)行后返回的結(jié)果,// 并把結(jié)果添加到 data 中,然后把 data 返回。sequence = sequence.then(item).then(function (res) {data.push(res);return data;});})// 遍歷結(jié)束后,返回一個(gè) Promise,也就是 sequence, 他的 [[PromiseValue]] 值就是 data,// 而 data(保存數(shù)組中的函數(shù)執(zhí)行后的結(jié)果) 也會(huì)作為參數(shù),傳入下次調(diào)用的 then 方法中。return sequence;
大概思路如下:全局定義一個(gè)promise實(shí)例sequence,循環(huán)遍歷函數(shù)數(shù)組,每次循環(huán)更新sequence,將要執(zhí)行的函數(shù)item通過sequence的then方法進(jìn)行串聯(lián),并且將執(zhí)行結(jié)果推入data數(shù)組,最后將更新的data返回,這樣保證后面sequence調(diào)用then方法,如何后面的函數(shù)需要使用data只需要將函數(shù)改為帶參數(shù)的函數(shù)。
上述內(nèi)容就是Promise中怎么實(shí)現(xiàn)異步串行執(zhí)行,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:Promise中怎么實(shí)現(xiàn)異步串行執(zhí)行
分享鏈接:http://www.chinadenli.net/article38/geggpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、App設(shè)計(jì)、品牌網(wǎng)站建設(shè)、App開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)