阿里前端測試題--關於ES6中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;
});

const mergePromise = ajaxArray => {
// 在這里實現你的代碼

};

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

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

從網上找到的答案我寫貼上:

var data = [];
var sequence = Promise.resolve();
ajaxArray.forEach(function(item){
  sequence = sequence.then(item).then(function(res){
    data.push(res);
    return data;
  });
})

return sequence;

解答思路和原理有空再研究貼上來。

更新--思路解析:

  首先理解一下javascript的執行機制--異步執行,也就是說兩個並列函數的執行順序不會先執行完第一個,再執行后一個。舉個栗子:

func A(){

  setTimeout(function(){

    console.log('a');

},3000);

}

func B(){

  setTimeout(function(){

    console.log('b');

},1000);

}

A();

B();

那么你覺得輸出結果是啥?不妨試下,會輸出b,a.

原因就是異步執行。當執行到A函數時,會注冊一個三秒后執行的函數,直接去執行B,而不是等三秒執行完A再去執行B。

promise可以實現同步執行

先說一下使用方法吧:promise和then配合使用,類似於回調函數,執行完promise之后才會執行then的內容

new Promise((resolve, reject) {

}).then(function(){

}).then(function(){})...

promise里面的兩個參數表示promise的執行狀態

但是值得注意的是then里面的東西可不是同步執行,並不是前一個執行完再執行后一個,then之間還是遵循異步原則的。

所以JavaScript、nodejs想要實現同步,各路神仙都有自己不同的理解和套路。

后續更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM