JavaScript
Promise 实现红绿灯
Promise 的实例状态变成 Resloved 或者 Rejected,就会触发 then 方法绑定的回调函数 提前解释一些方法或者钩子的含义 apply 、 call 、bind 三者的区别 apply 、 call 、bind 三者都是用来改变函数的 this 对象的指向的; apply 、 call 、bind 三者第一个参数都是 this 要指向的对象,也就是想指定的上下文; call …
Promise 的实例状态变成 Resloved 或者 Rejected,就会触发 then 方法绑定的回调函数 提前解释一些方法或者钩子的含义 apply 、 call 、bind 三者的区别 apply 、 call 、bind 三者都是用来改变函数的 this 对象的指向的; apply 、 call 、bind 三者第一个参数都是 this 要指向的对象,也就是想指定的上下文; call …
Promise 的实例状态变成 Resloved 或者 Rejected,就会触发 then 方法绑定的回调函数
// 定义了三个promise,指定时间后状态变成Resolved,都执行下一个promise,直到第三个,第三个完成,递归
function t1() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 1000, '绿灯');
});
}
function t2() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000, '黄灯');
});
}
function t3() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 3000, '红灯');
});
}
(function restart() {
t1().then((result) => {
console.log(result);
});
t2().then((result) => {
console.log(result);
});
t3().then((result) => {
console.log(result);
restart();
});
})();
如果设定绿灯是 5000ms,黄灯是 2000ms,红灯是 3000ms,那么就会先显示黄灯,后显示红灯,显示绿灯的同时也会显示黄灯
因为第二轮绿灯 5000ms 包含了黄灯的 5000ms
// 定义了三个灯的Promise实例,每定义一个,都会延迟指定时间后把状态变成Resolved,直到最后一个,然后递归
function green() {
return new Promise((resolve, reject) => {
console.log(`绿灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
});
}
function yellow() {
return new Promise((resolve, reject) => {
console.log(`黄灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
});
}
function red() {
return new Promise((resolve, reject) => {
console.log(`红灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
});
}
function ms_5000() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 5000);
});
}
function ms_3000() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
});
}
function ms_2000() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000);
});
}
(function restart() {
// 绿灯5000ms后转黄灯,黄灯3000ms后转红灯,红灯2000ms后,重复初始动作
green()
.then(ms_5000)
.then(yellow)
.then(ms_3000)
.then(red)
.then(ms_2000)
// arguments.callee:正在执行的这个函数的引用
.then(arguments.callee);
})();
// 第一个灯是一个Promise实例,状态先编程Resolved,然后,到过指定时间再变成Resolved,直到最后一个,然后递归
(function restart() {
new Promise((resolve, reject) => {
console.log(`绿灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(resolve, 5000);
});
})
.then(() => {
return new Promise((resolve, reject) => {
console.log(`黄灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
});
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
});
})
.then(() => {
return new Promise((resolve, reject) => {
console.log(`红灯:当前时间(${new Date().getSeconds()}s)`);
resolve();
});
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000);
});
})
// arguments.callee:正在执行的这个函数的引用
.then(arguments.callee);
})();
// 使用严格模式,arguments.callee(正在执行的这个函数的引用)无效
// 定义了一个handle函数,用于return一个含有Promise实例的函数,指定时间把状态变成了Resolved,直到最后一个,然后递归
function handler(timer) {
return function() {
var arr = [].slice.apply(arguments);
var that = this;
return new Promise((resolve, reject) => {
arr.unshift(resolve);
// 相当于timer(arr[0],arr[1])
timer.apply(that, arr);
});
};
}
(function restart() {
'use strict';
console.log(`绿灯:当前时间(${new Date().getSeconds()}s)`);
handler(setTimeout)
.bind(null, 5000)()
.then(() => {
console.log(`黄灯:当前时间(${new Date().getSeconds()}s)`);
return handler(setTimeout).bind(null, 3000)();
})
.then(() => {
console.log(`红灯:当前时间(${new Date().getSeconds()}s)`);
return handler(setTimeout).bind(null, 2000)();
})
.then(() => {
restart();
});
})();
// 避免了allpy和bind的使用,直接使用setTimeout,给handler传入延迟的时间,用户延迟多少ms后更改Promise状态至Resolved,直到最后一个,然后递归
function handler(ms) {
return function() {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
};
}
(function restart() {
'use strict';
console.log(`绿灯:当前时间(${new Date().getSeconds()}s)`);
handler(5000)()
.then(() => {
console.log(`黄灯:当前时间(${new Date().getSeconds()}s)`);
return handler(3000)();
})
.then(() => {
console.log(`红灯:当前时间(${new Date().getSeconds()}s)`);
return handler(2000)();
})
.then(() => {
restart();
});
})();
暂无评论
确认操作
请再次确认编辑图片
待上传图片 (剩余 0 张)
项目详情
确认评论邮箱
邀请制评论