Promise面试题

const promise = new Promise((resolve, reject) => {
    console.log(1);
    resolve();
    console.log(2);
})
promise.then(() => {
    console.log(3);
})
console.log(4);

Promise一旦创建立即执行

所以1,2输出

Promise.then 在所有的代码执行完毕后执行

所以3最后

所以是1243

2、第二题

const promise = new Promise((resolve, reject) => {
    resolve('success1');
    reject('error');
    resolve('success2');
});
promise.then((res) => {
    console.log('then:', res);
}).catch((err) => {
    console.log('catch:', err);
})

Promise一旦创建立即执行

resolve函数是当Promise对象的状态从“未完成”变为“成功”(即从pending变为resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数将Promise对象的状态从“未完成”变为“失败”(即从pending变为rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise只能resolve一次,剩下的调用都会被忽略。而一旦状态改变,就不会有再变,所以代码中的reject('error');不会有作用。
 
所以第二次resolve('success');也不会有作用。
答案:then:success1
 
3、第三题
Promise.resolve(1)
  .then(2)
  .then(Promise.resolve(3))
  .then(console.log)
Promise.resolve方法的参数,如果是一个原始值,或者是一个不具有then方法的对象
原始值即一些代表原始数据类型的值,也叫基本数据类型,Number,String,Boolean,Null,Undefined这些基本数据类型都是原始值。
则Promise.resolve方法返回一个新的Promise对象,状态为resolved。Promise.resolve方法的参数,会同时传给回调函数。
参数为1,number类型所以为原始值。所以1传给回调函数。
then方法接受的参数是函数,而如果传递的并非是一个函数,它实际上会将其解释为then(null),这就会导致前一个Promise的结果会传递下面。
2不是函数,所以前一个promise的结果是传给回调函数的1,往下传递。
答案 1
4、第四题,定时器
定时器相当于一个异步操作,会先向后执行

 所以执行结果是

原文地址:https://www.cnblogs.com/carry-2017/p/11736291.html