这是一个见仁见智的问题

个人总结:

  Promise 是异步编程的一种解决方案,将异步操作以同步操作的流程表达出来,避免了回调地狱的问题。

  Promise 是一个构造函数,我们可以通过该构造函数来生成Promise的实例。

  Promise对象有以下两个特点:

    (1)对象的状态不受外界影响。Promise 即承诺,后续必要兑现,一旦兑现则不可更改!其有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

    (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象只有两种状态改变:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就不会再变了。

  Promise也有一些缺点:

    首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。

    其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。

    第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

  Promise 的实例可以看做是一个状态展示器,我们可以将拥有状态及改变状态的业务通过Promise来实现,然后再结合async function进一步提升程序的可读性及易维护性。

  Promise虽然解决了我们项目开发中的很多问题,但我们也不能无脑的滥用。比如Promise.all,如果参数中promise有一个失败(rejected),则此实例回调必然失败(reject),就不会再执行then方法的回调了。在实际中可能只是一个不关键的数据加载失败,往往会导致其他所有的数据不会显示,使得项目的容错性大大降低。所以在开发过程中只会在必须依赖这几个步骤全部加载成功后才能继续向下执行的场景中采用它,比如继某一个函数执行结果之后再进行入后续操作、图片的预加载。

 

以上综合参考了:阮一峰的《ECMAScript 6 入门》的Promise一章张培跃的《web前端面试题对答篇:谈谈你对Promise的理解》