解題之前建議大家先看看promise的文檔[https://segmentfault.com/a/1190000002452115]
第一題:promise應(yīng)用的面試題
紅燈三秒亮一次埃跷,綠燈一秒亮一次蕊玷,黃燈2秒亮一次;如何讓三個(gè)燈按照這個(gè)規(guī)律不斷交替重復(fù)亮燈捌蚊?(用Promse實(shí)現(xiàn))三個(gè)亮燈函數(shù)已經(jīng)存在:
function red(){
console.log('red');
}
function green(){
console.log('green');
}
function yellow(){
console.log('yellow');
}*
//已知函數(shù)
function red(){
console.log('red');
}
function green(){
console.log('green');
}
function yellow(){
console.log('yellow');
}*
//亮燈一次 函數(shù)
var lightUp = function(timmer, cl){
return new Promise(function(resolve, reject) {
setTimeout(function() {
cl();
resolve();
}, timmer);
});
};
//promise
var myPromise = new Promise(function(resolve, reject){resolve();});
var step = function(pro) {
pro.then(function(){
return lightUp(3000, red);
}).then(function(){
return lightUp(1000, green);
}).then(function(){
return lightUp(2000, yellow);
}).then(function(){
//遞歸
step(pro);
});
}
step(myPromise);
第二題:
實(shí)現(xiàn)一個(gè)LazyMan,可以按照以下方式調(diào)用:
LazyMan(“Hank”)輸出:
Hi! This is Hank!
LazyMan(“Hank”).sleep(10).eat(“dinner”)輸出
Hi! This is Hank!
//等待10秒..
Wake up after 10
Eat dinner~
LazyMan(“Hank”).eat(“dinner”).eat(“supper”)輸出
Hi This is Hank!
Eat dinner~
Eat supper~
LazyMan(“Hank”).sleepFirst(5).eat(“supper”)輸出
//等待5秒
Wake up after 5
Hi This is Hank!
Eat supper
以此類(lèi)推近弟。
//等待函數(shù)
function wait(second) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Wake up after ' + second);
}, second * 1000);
});
}
//鏈?zhǔn)?promise
var LazyMan = function(name) {
var p = new Promise(function (resolve, reject) {
resolve('Hi! This is ' + name + '!');
});
return {
sleep: function (second) {
p = p.then(function (msg) {
console.log(msg);
return wait(second);
});
return this;
},
sleepFirst: function (second) {
var op = p;
p = wait(second).then(function (msg) {
console.log(msg);
return op;
});
return this;
},
eat: function (part) {
var pn = new Promise(function (resolve) {
resolve('Eat ' + part + '~');
});
p = p.then(function (msg) {
console.log(msg);
return pn;
});
return this;
},
print: function () {
return p.then(function (msg) {
console.log(msg);
});
}
};
}
exports.LazyMan = LazyMan;
本題有多種方案缅糟,感興趣的可以嘗試面向?qū)ο蟮绕渌绞絹?lái)實(shí)現(xiàn)。