js代码执行分析-Promise

103 阅读3分钟

js代码执行分析-Promise

主要考察点

  • 执行顺序
  • 值透传
  • 错误处理
  • 返回值
  • 链式调用

难易程度:⭐

const promise = new Promise((resolve, reject) => {
    console.log(1);  // 常任务1
    resolve();  // 微任务1
    console.log(2);  // 常任务2
});
promise.then(() => {
    console.log(3);  // 微任务1_常任务1
});
console.log(4);  // 常任务3

执行结果:

1
2
4
3

难易程度:⭐⭐

1

setTimeout(() => {
    console.log(5);  // 宏任务1_常任务1
}, 0);

new Promise(resolve => {
    console.log(1);  // 常任务1
    resolve(3);  // 微任务1,作为结果返回
    Promise.resolve().then(()=> {
        console.log(4);  // 微任务2_常任务1
    });
}).then(num => {
    console.log(num);  // 微任务1_常任务1
});

console.log(2);  // 常任务2

执行结果:

1
2
4
3
5

2

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('once');  // 多次调用只会执行一次
    resolve(Date.now());
  }, 1000);
});
 
const start = Date.now();
promise.then((res) => {
  console.log(res, Date.now() - start);
});
promise.then((res) => {
  console.log(res, Date.now() - start);
});
promise.then((res) => {
  console.log(res, Date.now() - start);
});

执行结果:

once
success 1008
success 1008
success 1008

3

var p = new Promise((resolve, reject) => {
  reject(Error('The Fails!'));
});

p.catch(error => console.log(error.message));
p.catch(error => console.log(error.message));


var p1 = new Promise((resolve, reject) => {
    reject(Error('The Fails!'));
}).catch(error => console.log(error))
    .then(error => console.log(error));

执行结果:

The Fails!
The Fails!
Error: The Fails!
    at <anonymous>:10:12
    at new Promise (<anonymous>)
    at <anonymous>:9:10

5

var p = new Promise((resolve, reject) => {
    resolve('Success!');
  }).then(() => {
    throw Error('Oh noes!');
  }).catch(error => {
    return "actually, that worked"
  }).catch(error => console.log(error.message));
console.log(p);

执行结果:

Promise {<pending>}
[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "actually, that worked"

6

Promise.resolve('Success!').then(data => {
    return data.toUpperCase();
  }).then(data => {
    console.log(data);
    return data
  }).then(console.log);

执行结果:

Success!
Success!

7

Promise.resolve('Success!').then(() => {
    throw Error('Oh noes!');
  }).catch(error => {
    return 'actually, that worked'
  }).then(data => {
    throw Error('The fails!');
  }).catch(error => console.log(error.message));

执行结果:

The fails!

难易程度:⭐⭐⭐

1

Promise.resolve(1).then((res) => {
    console.log('a', res);
    return 2;
  }).catch((err) => {
    return 3;
  }).then((res) => {
    console.log('b', res);
  });

执行结果:

a 1
b 2

2

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 1000);
});

const promise2 = promise1.then(() => {
  throw new Error('error');
});
 
console.log('promise1', promise1);
console.log('promise2', promise2);
 
setTimeout(() => {
  console.log('promise1', promise1);
  console.log('promise2', promise2);
}, 2000);

执行结果:

promise1  Promise{<pending>}
            [[PromiseState]]: "fulfilled"
            [[PromiseResult]]: "success"

promise2  Promise{<pending>}     
            [[PromiseState]]: "rejected"
            [[PromiseResult]]: Error: error at <anonymous>:8:9

等待3秒

promise1  Promise{<pending>}
            [[PromiseState]]: "fulfilled"
            [[PromiseResult]]: "success"

promise2  Promise{<pending>}     
            [[PromiseState]]: "rejected"
            [[PromiseResult]]: Error: error at <anonymous>:8:9

3

Promise.resolve().then(() => {
    return new Error('error');
  }).then((res) => {
    console.log('then: ', res);
  }).catch((err) => {
    console.log('catch: ', err);
  });

执行结果:

then:  Error: error

4

Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log);

执行结果:

1

5

Promise.resolve().then(function success (res) {
    throw new Error('error');
  }, function fail1 (e) {
    console.log('fail1: ', e);
  }).catch(function fail2 (e) {
    console.log('fail2: ', e);
  });

// 变种后
Promise.resolve().then(function success1 (res) {
    throw new Error('error');
    }, function fail1 (e) {
    console.log('fail1: ', e);
  }).then(function success2 (res) {
  }, function fail2 (e) {
    console.log('fail2: ', e);
  });

执行结果:

fail2:  Error: error

fail2:  Error: error

6

var p = new Promise((resolve, reject) => {
  return Promise.reject(Error('The Fails!'));
});
p.catch(error => console.log(error.message));
p.catch(error => console.log(error.message));

执行结果:

报错:Error: The Fails!

难易程度:⭐⭐⭐⭐

1

const promise = Promise.resolve().then(() => {
    return promise;
});
promise.catch(console.error);

执行结果:

报错:TypeError: Chaining cycle detected for promise #<Promise>

2

Promise.resolve().then(() => {
    console.log('then');
});

console.log('end');

执行结果:

then
end

3

const first = () => (new Promise((resolve, reject)=>{
    console.log(3);
    let p = new Promise((resolve, reject)=>{
        console.log(7);
        setTimeout(()=>{
           console.log(5);
           resolve(6); 
        }, 0);
        resolve(1);
    }); 
    resolve(2);
    p.then((arg)=>{
        console.log(arg);
    });
}));
 
first().then((arg)=>{
    console.log(arg);
});
console.log(4);

执行结果:

3
7
4
1
2
5

分析:

const first = () => (new Promise((resolve, reject) => {
    console.log(3);  // 常任务1
    let p = new Promise((resolve, reject) => {
        console.log(7);  // 常任务2
        setTimeout(()=>{  // 宏任务1
           console.log(5); // 宏任务1_常任务1 
           resolve(6);  // 无意义迷糊行为
        }, 0);
        resolve(1);  // 微任务1
        console.log(0);  // 常任务3
    }); 
    resolve(2);  // 微任务2
    p.then((arg)=>{
        console.log(arg);  // 微任务2_常任务1
    });
}));

first().then((arg) => {
    console.log(arg);  // 微任务1_常任务1
});
console.log(4);  // 常任务

代码分析:

任务名输出
常任务13
常任务27
常任务34
微任务1_常任务11
微任务2_常任务12
宏任务1_常任务15

难易程度:⭐⭐⭐⭐⭐

4

console.log('a1');
async function async1() {
  console.log(1);
  const result = await async2();
  console.log(3);
}

console.log('a2');
async function async2() {
  console.log(2);
}

console.log('a3');
Promise.resolve().then(() => {
  console.log(4);
});

console.log('a4');
setTimeout(() => {
  console.log(5);
});

console.log('a5');
async1();

console.log(6);

执行结果:

a1
a2
a3
a4
a5
1
2
6
4
3

5

分析: 常任务 > async > Promise.then > await > setTimeout