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