今天作了阿里前端的筆試題目,原題目是這樣的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想要實現同步,各路神仙都有本身不一樣的理解和套路。
後續更新。