promise順序執行,返回結果存放在陣列

2022-08-27 06:03:08 字數 1804 閱讀 5085

遇到面試的乙個程式設計題:三個返回promise物件的非同步操作,讓你寫乙個函式可以將這些操作順序執行,並返回乙個陣列包含三個非同步物件的結果

非同步物件:

//

非同步函式a

var a =function () ,

1000

) })}//

非同步函式b

var b =function () )}//

非同步函式c

var c =function () ,

500)

})}

注意:promise物件在例項化的時候就會執行,所以函式都是返回promise物件,這樣執行函式的時候就會執行promise物件中的內容

我們期望的結果是:

//a

//b//c

//(3) ["a", "b", "c"]

//done

所以關鍵是怎麼順序執行promise並把結果乙個乙個塞到陣列裡

注意promise物件是不能直接得到resolve傳來的結果的,一般的方式是.then裡面寫resolve的**函式,所以剛才的需求可以這樣寫

var mergepromise = async

function mergepromise(arr) )})}

return mergedajax.then(()=>)

};mergepromise([a,b,c]).then(function (data) );

還有這種寫法:

var mergepromise = async function

mergepromise(arr) )

}return mergedajax.then((val)=>)

};mergepromise(ajaxarray).then(

function

(data) );

以上兩種其實是乙個then的鏈式呼叫,最後返**集了非同步結果的陣列

這個需求用asnyc await的寫法就比較好看和直觀

async

function queue(arr)

return

data

}queue([a, b, c])

.then(data =>);

感覺上是返回了乙個data陣列,應該會報沒有.then方法的錯誤,然而實際上是返回了乙個promise.resolve(data)

至於為什麼能將resolve的值抽離出來,是應為await是generator的語法糖,比如乙個asnyc函式:

async function myfn(arr)

myfn([a,b,c])

其實等價於自動執行的generator函式

function

spawn(genf)

catch

(e)

if(next.done)

promise.resolve(next.value).then(

function

(v) );//

這裡gen.next(v)執行賦值操作 let res = v 也就是為什麼async方法能得到promise中resolve的值

}, function

(e) );

});}

step(

function() );

});}function

fn(args) );

}fn()

最後說一下,如果要讓非同步操作併發,可以用promise自帶的all方法

promise執行順序總結

1 const promise new promise resolve,reject promise.then console.log 5 執行結果是 1,2,5,4 解釋 promise的建構函式是同步執行,promise.then中的函式是非同步執行。2 const promise new pr...

ES6 Promise 並行執行和順序執行

1.promise.all 並行執行promise geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta new promise resolve,reject 1000 t...

ES6 Promise 並行執行和順序執行

geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta newpromise resolve,reject 1000 then result result const get...