一道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。 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。 給出每段小木棍的長度,編程幫