一个面试常问的代码题
function increment(value) {
return value + 1;
}
function doubleUp(value) {
return value * 2;
}
function output(value) {
console.log(value);// => (1 + 1) * 2
}
var p = Promise.resolve(1);
p.then(increment)
.then(doubleUp)
.then(output)
分析:
1.首先p的状态是resolve 值是1
2.因为p的状态是resolve 因此执行increment函数,increment的value值是1
返回值是2 因此increment的状态是resolve 所以继续执行doubleUp函数
3.以此类推,最终输出结果为4
面试常见的代码填空题
function sleep(time){
// 请写出你的代码
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);
效果:先执行输出2 等两秒后输出"后续操作"
分析:
两秒后输出 需要用到定时器 只输出一次 因此使用setTimeout
输出在then里面 因此sleep的状态需要是resolve
实现代码
function sleep(time){
return new Promise(function(resolve,reject){
// 异步操作,根据执行结果,决定是否调用 resolve,reject
setTimeout(function(){
resolve()
}, time)
})
}
promise返回值状态如何判断
function do1() {
console.log("任务1");
}
function do2() {
console.log("任务2");
}
var p = new Promise((resolve,reject)=>{ resolve()})
p.then(do1)
.catch(do2)
var p1 = p.then(do1)
var p2 = p1.then(do2)
输出结果:任务1
第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行。输出任务1
p1的状态由do1()来决定。因为do1并没有明确指定返回值,则返回值就是undefined. p1
的状态就是resolved。
第二步:接下来看p2。由于p1的状态是resolved,所以它并不会执行do2, p2的状态没有变化,仍
保持p1的状态:resolved。
总结
1.如果p1的状态是pending,则p2的状态也是pending
2.如果p1的状态是resolved,then()会去执行do2,则p2的状态由do2的返回值决定
2.1如果do2返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是do2函数
的return值
2.2如果do2返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准
2.3如果f_ok这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2
的promiseValue就是这个错误对象
rejected与resolved一致我就不多赘述了
如果以上看不太懂了话可以参考以下个人理解:
若执行函数有return 则值为return返回的值
若执行函数没有return 则值返回一个undefined
两种情况 该函数的状态都为resolved
那什么情况为rejected呢?
若出现错误 或者该函数设定为rejected 状态才会是rejected 其他情况都不是rejected