不需要深入,但是需要了解的面试题promise

164 阅读3分钟

关于promise面试题

var p = new Promise((resolve,reject)=>{
	resolve(1)//主动调用resolve,并传入
})
// 此时,P的状态是resolved,且值promiseValue 是1.
p.then((res)=>{
    // 因为p的状态是resolved,所以自动执行then的第一个参数,并且把promisevalue传进来。
	console.log("then,ok",res)
})

输出结果是then,ok 1

var p = new Promise((resolve,reject)=>{
	reject(2)//主动调用reject,并传入实参
})
// 此时,P的状态是rejected,且值promiseValue 是2.

p.then((res)=>{
    // 因为p的状态是resolved,所以这句代码不会执行。
	console.log("then,ok",res)
},(err)=>{
    // 因为p的状态是rejected,所以自动执行then的第二个参数,并且把promisevalue传进来。
	console.log("then,err",err)
})

输出结果为then,err,2

var p1 = new Promise(()=>{});
var p2 = p1.then(function f_ok(){}, function f_err(){}); // p2也是一个promise对象。
console.dir(p1); // pending
console.dir(p2); // pending

输出结果:p1为pending p2也为pending

var p1 = new Promise((resolve,reject)=>{ resolve()});
var p2 = p1.then(function f_ok(){
	return 1
}, function f_err(){}); // p2也是一个promise对象。
console.dir(p1);	// resolved, undefined
console.dir(p2); // resolved, 1    

因为p1中resolve没有返回值所以为undefined 而p2 return返回1所以结果为1

var p1 = new Promise((resolve,reject)=>{ resolve()});
var p2 = p1.then(function f_ok(){
	var temp = new Promise((resolve,reject)=>{ resolve({a:1}) }); 
	return temp;
}, function f_err(){}); 

console.dir(p2); // resolved, {a:1}

p1是resolve但是没有返回值所以是undefined 然后走上面的f_ok temp返回值返回给p2所以是resolved{a:1}

var p1 = new Promise((resolve,reject)=>{ resolve()});
var p2 = p1.then(function f_ok(){
	console.log(abc);// 这里故意犯错
}, function f_err(){}); 

console.dir(p2);

上面p1状态为resolved,undefined执行f_ok但是p2里面故意犯错所以这里p2为reject,abc

var p1 = new Promise((resolve,reject)=>{ reject(100)});
var p2 = p1.then(function f_ok(){
	
}, function f_err(errVal){
	var temp = new Promise((resolve,reject)=>{ resolve({b:errVal}) }); 
	return temp;
}); 

console.dir(p2);

p1为rejected,返回值为100,所以p2走f_err100传给errVal所以p2打印resolved{b:100}

function do1() {
    console.log("任务1");
}
function do2() {
    console.log("任务2");
}
function do3() {
     console.log("任务3");
}
function do4() {
    console.log("任务4");
}

var p = new Promise((resolve,reject)=>{ resolve()})
p.then(do1)
 .then(do2)
 .then(do3)
 .then(do4);

由于p状态为resolved,但是没有返回值所以第一个打印任务一,由于第一个为resolved所有后面会打印任务二,所以依次打印任务一,任务二,任务三,任务四

function do1() {
    console.log("任务1");
}
function do2() {
    console.log("任务2");
}
function do3() {
     console.log("任务3");
}
function do4() {
    console.log("任务4");
}

var p = new Promise((resolve,reject)=>{ resolve()})
p.then(do1)
 .then(do2)
 .catch(do3)
 .then(do4);

由于p的状态为resolved所以会走第一个第二个,到了第三个由于状态为resolved所以不会走,然后走第四个,所以打印结果为任务一,任务二,任务四

function do1() {
    console.log("任务1");
    console.log(abc); //故意犯错
}
function do2() {
    console.log("任务2");
}
function do3() {
     console.log("任务3");
}
function do4() {
    console.log("任务4");
}

var p = new Promise((resolve,reject)=>{ resolve()})
p.then(do1)
 .then(do2)
 .then(do3)
 .catch(do4);

由于p状态为resolved,所以会走第一个但是第一个这里故意犯错所以状态变为rejected,第二第三为.then所以不走,第四个为catch所以走第四个,这里就打印任务一,任务四

function increment(value) {
    return value + 1;
}
function doubleUp(value) {
    return value * 2;
}
function output(value) {
    console.log(value);//
}
var p = Promise.resolve(1);
p.then(increment)
 .then(doubleUp)
 .then(output)

由于p状态为resolved返回值为1所以1会传值到第一个value所以第一个返回值就为1+1=2由于状态值为成功所以会走第二个值传到第二个value里面所以第二个返回值就是4,接着会走第三个所以第三个这里输出4

每日鸡汤

你的人生不会辜负你的。那些转错的弯,那些流下的泪水,那些滴下的汗水,全都让你成为独一无二的自己。