• 微信登录后才能进行查看好友列表,是按照顺序进行的,这是同步。异步是在登录的结果不确定的时候就可以访问好友列表,是异步。从原则上讲。两个问题是可以进行异步的。
    • 异步的时候 .then执行的是正确的结果,.error执行的是错误的结果,比如我查看公众号成功或者失败,在这个基础上还可以在里面继续写.then/.error.这就是链式调用。

      .then(.then/.error) .error(.then/,error)

    • 为了把异步变成同步,引入了 Await函数。但是出现了一些问题:在变成同步的时候,我不能在访问公众号的同时访问朋友圈。这相当于生硬的把可以异步的东西变成同步了。所以引入了 Promote。

    • Promise是把同步变成异步。在登录成功之后(总体同步),把硬性的<同步变异步>纠正(在访问公众号的同时也可以访问朋友圈),使得再次异步(相当于把登录后的东西变成一个组,组内异步)。由于JS是单线程的,如果只能同步执行,其他所有线程都需要进行等待,这是最坏的打算。Promise是引入来将线程进行局部异步的,从而将阻塞事件进行缩短。 比如 X和Y的执行,如果X时间长,两个使用的时间是在(X,X+Y)之间。 从编程角度来看,没有阻塞,从客户角度看,阻塞依然存在。

      Promise().then() Promise().error()image.png

    • Promise的优势:

    1.如果只能同步执行,只能 A(B(C)),A的请求等待B的结果,B的结果等待C的结果,即避免多层嵌套,可读性和维护性都很差。
    使用了Promise,A的执行可以不等待C的结果,异步进行。大大提高了效率、可读性、维护性等。

    1. firstAsync()
    2. .then(function(data){
    3. //处理得到的 data 数据
    4. //....
    5. return secondAsync();
    6. })
    7. .then(function(data2){
    8. //处理得到的 data2 数据
    9. //....
    10. return thirdAsync();
    11. })
    12. .then(function(data3){
    13. //处理得到的 data3 数据
    14. //....
    15. });

    2.更好的捕获错误。

    1. // 失败情况
    2. function fetch(callback) {
    3. setTimeout(() => {
    4. throw Error('请求失败')
    5. }, 2000)
    6. }
    7. try {
    8. fetch(() => {
    9. console.log('请求处理') // 永远不会执行
    10. })
    11. } catch (error) {
    12. console.log('触发异常', error) // 永远不会执行
    13. }
    14. // 程序崩溃
    15. // Uncaught Error: 请求失败
    16. 2)如果使用 promises 的话,通过 reject 方法把 Promise 的状态置为 rejected,这样我们在
    17. //then 中就能捕捉到,然后执行“失败”情况的回调。
    18. function fetch(callback) {
    19. return new Promise((resolve, reject) => {
    20. setTimeout(() => {
    21. reject('请求失败');
    22. }, 2000)
    23. })
    24. }
    25. fetch()
    26. .then(
    27. function(data){
    28. console.log('请求处理');
    29. console.log(data);
    30. },
    31. function(reason, data){
    32. console.log('触发异常');
    33. console.log(reason);
    34. }
    35. );
    36. //当然我们在 catch 方法中处理 reject 回调也是可以的。
    37. function fetch(callback) {
    38. return new Promise((resolve, reject) => {
    39. setTimeout(() => {
    40. reject('请求失败');
    41. }, 2000)
    42. })
    43. }
    44. fetch()
    45. .then(
    46. function(data){
    47. console.log('请求处理');
    48. console.log(data);
    49. }
    50. )
    51. .catch(function(reason){
    52. console.log('触发异常');
    53. console.log(reason);
    54. });
    • Promise缺点:无法取消。一旦新建会立即执行,不会中途取消。
    • Promise风格API跟回调风格的API不同,它的参数跟同步的API是一致的,但是它的返回值是个Promise对象,要想得到真正的结果,需要在then的回调里面拿到。