阿里前端測試題--關於ES6中Promise函數的理解與應用

今天作了阿里前端的筆試題目,原題目是這樣的javascript

 

//實現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]前端

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

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

return sequence;node

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

更新--思路解析:數組

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

func A(){異步

  setTimeout(function(){函數

    console.log('a');spa

},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想要實現同步,各路神仙都有本身不一樣的理解和套路。

後續更新。

相關文章
相關標籤/搜索