现像

Promise 同步与异步的位置

  1. // Promise() 同步
  2. // executor 同步
  3. const p = new Promise((resolve, reject) => {
  4. })
  5. // 异步
  6. p.then((res) => {
  7. })

问题:
为什么 Promise 执行是同步,p.then 是异步?

回答这个问题,先看一个例子:

  1. // 已引入jQuery
  2. $.ajax({
  3. url: 'http://localhost:3000/data.json', // [{"name":"zhangsan"}, {"name":"lisi"}, {"name": "wangwu"}]
  4. success (data){
  5. console.log(getName(data));
  6. }
  7. })
  8. console.log('I am a crazy guy.');
  9. function getName(data){
  10. return data.map(item => item.name);
  11. }

输入的结果是会先打印 'I am a crazy guy.',再打印 ajax 中 sucess 的 console.log 数组的结果。
原因是 ajax 是异步的操作,会存在执行的时间。
如果我们想把 ajax 的回调变成同步的话,把ajax的 async 改为 false,

  1. var data = $.ajax({
  2. url: 'http://localhost:3000/data.json', // [{"name":"zhangsan"}, {"name":"lisi"}, {"name": "wangwu"}]
  3. async: false
  4. })
  5. console.log(getName(data.responseJSON);
  6. console.log('I am a crazy guy.');
  7. function getName(data){
  8. return data.map(item => item.name);
  9. }

这时就会先打印 ajax 的 data(阻塞),再打印出 crazy guy,变为同步的关系。
虽然变成了同步关系,但是没有完成逻辑分离的动作。因为ajax下面每一个语句都是同步的关系,crazy guy 也被 ajax 阻塞了。

这样不符合我们的需求,才有了 Promise 的出现。

  1. const p = new Promise((resolve, reject) => {
  2. $.ajax({
  3. url: 'http://localhost:3000/data.json',
  4. success(data) {
  5. resolve(data);
  6. }
  7. });
  8. });
  9. p.then((res => {
  10. console.log(getName(res));
  11. }));
  12. console.log('I am a crazy guy.');
  13. function getName(data) {
  14. return data.map(item => item.name);
  15. }

会先打印 crazy guy,再打印 ajax 输出。完美解决 ajax 的 async 为 false,导致后面语句全部阻塞的问题。

回调地狱的最优解

Promise 配合上 async / await

  1. function getData() {
  2. return new Promise((resolve, reject) => {
  3. $.ajax({
  4. url: 'http://localhost:3000/data.json',
  5. success(data) {
  6. resolve(data);
  7. }
  8. });
  9. })
  10. }
  11. doSth();
  12. async function doSth() {
  13. const data = await getData();
  14. console.log(getNames(data));
  15. }
  16. console.log('I am a crazy guy.');
  17. function getName(data) {
  18. return data.map(item => item.name);
  19. }

总结

Promise 存在意义
Promise 是异步问题同步化解决处理的最优化方案。可以避免异步程序同步化阻塞同步代码执行。
Promise 只是顺路把回调地狱的问题改为链式操作,但也不是其存在的目的和最优的解决回调地狱的方案。