1. 程式人生 > >一道promise的小題目(Promise非同步流程控制)

一道promise的小題目(Promise非同步流程控制)

用Promise控制非同步流程,三個非同步任務,時間可能有先後,但是要按照想要的順序輸出。
我這裡用四種方法解決,其實也就是考察你對Promise的理解,基礎題了。

//實現mergePromise函式,把傳進去的陣列順序先後執行,
//並且把返回的資料先後放到陣列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;
});



function mergePromise(ajaxArray) {
//todo 補全函式
}

mergePromise([ajax1, ajax2, ajax3]).then(data => {
    console.log('done');
    console.log(data); // data 為 [1, 2, 3]
});

// 分別輸出
// 1
// 2
// 3
// done
// [1, 2, 3]

也就是補全上面的mergePromise函式,得到如上的輸出。

1.最好的方案async

function mergePromise(ajaxArray) {
    let arr = [];
    async function run() {
        for(let ifun of ajaxArray) {
            let cur = await ifun();
            arr.push(cur);
        }
        return arr;
    }
    return run();
}

2.自己構造then的鏈

function mergePromise(ajaxArray){
    let arr = [];
    let p = Promise.resolve();
    ajaxArray.forEach(item=>{
        p = p.then(data=>{
            console.log(data);
            if(data){
                arr.push(data);
            }
            return item();
        });
    })
    return p.then(data=>{
        arr.push(data);
        return arr;
    })
}

先加一層完成狀態的promise(即Promise.resolve()),然後構造一層then鏈,注意第一層是沒有data的,第一次返回的是item(),也就是ajax1(),返回了1,下一步才有data,即data是1,最後一個item()就是ajax3(),呼叫並return,我們要額外在外面用then接受上一步狀態改變的結果也就是上一步return的3(promise中直接return的話是返回resolve的狀態)最後返回arr,讓mergerPromise接受即可。

3.遞迴,另一種思路

let timeout = function (num, ms) {
    return new Promise(function (resolve,reject) {
        setTimeout(() => {
            resolve(num);
        }, ms)
    });
}

let timeout1 = timeout(1, 500);
let timeout2 = timeout(2, 2000);
let timeout3 = timeout(3, 1000);

let myPromise = new Promise(function (resolve,reject) {
   
    let arr = [];
    let timeouts = [timeout1,timeout2,timeout3];
    runIndex(0);
    function runIndex(index){
        timeouts[index].then(data=>{
            console.log(data)
            arr.push(data);
            if(index<timeouts.length-1) {
                console.log('index',index);
                index++;
                runIndex(index);
            }else {
                resolve(arr);
            }
            
        })
    }
});


myPromise.then(data => {
    console.log(data);
    console.log("done!");
})

我覺得遞迴做這題就是一種bug的做法,完全就是利用了遞迴的域環境的改變。

4.最暴力的直接手寫鏈

function mergePromise(ajaxArray) {
    let arr = [];
    // ajaxArray[0]();
    return ajaxArray[0]().then(data=>{
        arr.push(data);
        return ajaxArray[1]();
    }).then(data=>{
        arr.push(data);
        return ajaxArray[2]();
    }).then(data=>{
        arr.push(data);
        return arr;
    })
}

也就是上個迴圈那個展開的樣子,好處就是不用加一層resolve的殼。

到此結束,各位有啥意見可以留個言。

相關推薦

一道promise題目Promise非同步流程控制

用Promise控制非同步流程,三個非同步任務,時間可能有先後,但是要按照想要的順序輸出。 我這裡用四種方法解決,其實也就是考察你對Promise的理解,基礎題了。 //實現mergePromise函式,把傳進去的陣列順序先後執行, //並且把返回的資料先後放到陣列data中 const timeout =

紅綠燈面試題目Promise, 佇列實現

紅燈三秒亮一次,黃燈1秒亮一次,綠燈2秒亮一次,,如何讓三個燈不斷交替重複亮燈 light函式返回一個Promise狀態,當Promise狀態從Pending => fulfilled,step才會執行下一個then。這裡使用遞迴,不使用迴圈是因為Ja

微信程式中使用Echarts非同步請求資料

在微信小程式中使用Echarts,主要分為以下幾步: 1.首先要下載ecomfe/echarts-for-weixin專案,下載後將ec-canvas資料夾複製到小程式專案中,假設放在根目錄下utils資料夾中。 2.在要實現echarts圖的頁面引入echarts.js檔案,例如要在i

一道閉包題目常看看

function f1(){ var n=999; nAdd = function(){ n += 1 } function f2(){ console.log(n); } return f2; } var result1=f1(); var result2=f1(); res

關於python的學習的題目1-----------Triplet標籤資料集設計

直接上題目:     照片序號1~5000標示“”a“”類 照片序號5001~10000標示“”b“”類 -------(中間省去若干) 照片序號45001~50000標示“”g“”類 總共10個類對應五萬張影象,現在自己製作一個數據集有五萬組圖片序列 每一組分別是一

Nodejs:非同步流程控制

//非同步操作,序列有關聯(瀑布流模式) //npm install async --save-dev var async = require('async'); function exec() { async.waterfall( [ fun

Nodejs:非同步流程控制

function oneFun() { // setTimeout(function () { // console.log("a"); // }, 1000); i = 0; setInterval(function () {

3、關於匿名內部類一個題目補全程式碼

/* 匿名內部類面試題: 按照要求,補齊程式碼 interface Inter { void show(); } class Outer { //補齊程式碼 } class OuterDemo { public static void mai

c語言題目數字整除。。。2014.5.23

定理:把一個至少兩位的正整數的個位數字去掉,再從餘下的數中減去個位數的5倍。當且僅當差是17的倍數時,原數也是17的倍數 。 例如,34是17的倍數,因為3-20=-17是17的倍數;201不是17的倍數,因為20-5=15不是17的倍數。輸入一個正整數n,你的任務是判斷它是否是17的倍數。

一道容易出錯的題目有關負數的補碼

這道題的答案是什麼? #include <stdio.h> #include <string.h> int main() { char a[1000]; int i =

nyist oj 19 擅長排列的dfs搜索+STL

功能 asdf www play algorithm 是否 back using 上傳 擅長排列的小明 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描寫敘述 小明十分聰明。並且十分擅長排列計算。比方給小明一個數字5,他能立馬給出1

Python輸入、輸出;簡單運算符;流程控制

字符 print 輸入密碼 優先 註解 user python span gif 一 輸入輸出 python3中統一都是input,python2中有raw_input等同於python3的input,另外python2中也有input 1.res=input("pytho

洛谷 P1125 笨NOIp2008提高組T1

end ans 小寫字母 else 代碼 整數 turn clas efi 題目描述 笨小猴的詞匯量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的幾率非常大! 這種方法的具體描述如下:假設maxn是單詞中出現次數

Python基礎總結字符串常用,數字類型轉換,基本運算符與流程控制

換行符 目錄 字母 字符轉換 中文 判斷 star dsw 註意 一.字符串常用操作 #Python strip() 方法用於移除字符串頭尾指定的字符(默認為空格) name=‘*egon**‘ print(name.strip(‘*‘))#移除 name 變量對應的值

旋轉數組的最數字C++ 和 Python 實現

ram 兩個 requires images red 輸入 off internet iat (說明:本博客中的題目、題目詳細說明及參考代碼均摘自 “何海濤《劍指Offer:名企面試官精講典型編程題》2012年”) 題目   把一個數組最開始的若幹個元素搬到數組的末尾,我們

node.js對mongodb的連接&增刪改查附async同步流程控制

color var literal int lba node () n! node.js 1.啟動mongodb數據庫 官網下載mongodb數據庫 在mongodb根目錄下創建文件夾:假設取名為test。 我們認為test就是mongodb新建的數據庫一枚。 創建批處理文

Clean程序控件消息

頭文件 instance 圖片 基於 geb change spa color 技術分享 一 . 準備工作 創建一個基於對話框的MFC項目 刪除對話框上的工具 二 . 實現將seven圖片貼到上面,按一下則換一張圖片 1.在資源視圖中添加位圖資源,通過屬性修改圖片ID

day2字符串、格式化輸出、運算符、流程控制

一起 匹配 加減 years 錯誤 n) 算數 圖片 small 一、字符串 在Python中,加了引號的字符都被認為是字符串! 單引號、雙引號、多引號的區別? 單引號和 雙引號沒有任何區別,但是某種情況下需要單雙配合 如 msg = " My name is Small

使用JavaScript實現剪刀石頭布的遊戲由淺到深

spa val 能夠 click 隨機 相對 運算 func query 使用JavaScript實現剪刀石頭布的小遊戲 簡單的解析: 剪刀石頭布的原理類似於一個數組中數字大小的比較,當然我們也可以將其分別使用對應的數字來代表剪刀石頭布,在這裏我們將 0 - 剪

木棍爆搜減枝

iostream 一道 原來 沒有 n) -o 編號 組合 繼續 題目描述 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。 給出每段小木棍的長度,編程幫