[关闭]
@15013890200 2018-10-11T17:14:26.000000Z 字数 2151 阅读 1470

详解Promise串行、并行

javascript promise

  • 之前一章初步介绍了promise的使用方法。今天再深入探讨一下promise的用法,并模拟使用场景
  • promise出现以前。某个ajax发送的请求内容依赖于另一个ajax请求的内容时,往往是将该ajax至于另一个ajax请求内部。这样一来,代码多重嵌套不利于阅读和维护。此时可以利用promise串行,挨个执行ajax(即后面的ajax只有在前面ajax执行完成后才有可能执行)。
  • 当某项操作需要在多个ajax请求结束后执行,且ajax请求顺序没有要求,则可以利用promise的并行,同时执行多个ajax。
  • 串行和并行的特点,见代码相应的注释处

  1. function log(str){
  2. console.log(str);
  3. };
  4. function write(obj){
  5. for(let key in obj){
  6. if(obj[key]){
  7. document.write(key + ': ' + obj[key] + '<br>');
  8. }
  9. }
  10. }
  11. var condition = {
  12. name: null,
  13. age: null,
  14. addr: null
  15. };
  16. var func = {
  17. getName: function(resolve,reject){
  18. return new Promise(function(resolve,reject){
  19. log('getName request start...')
  20. setTimeout(function(){
  21. log('getName request complete!')
  22. let random = Math.random();
  23. let ret = null;
  24. if(random > 0.1){
  25. condition.name = 'wangjun';
  26. ret = {
  27. code: 0,
  28. time: random
  29. };
  30. resolve(ret);
  31. }
  32. else{
  33. ret = {
  34. name: 'getName',
  35. code: 1,
  36. time: random
  37. };
  38. reject(ret);
  39. }
  40. },500);
  41. });
  42. },
  43. getAge: function(){
  44. return new Promise(function(resolve,reject){
  45. log('getAge request start...')
  46. setTimeout(function(){
  47. log('getAge request complete!')
  48. let random = Math.random();
  49. let ret = null;
  50. if(random > 0.2){
  51. condition.age = 20;
  52. ret = {
  53. code: 0,
  54. time: random
  55. };
  56. resolve(ret);
  57. }
  58. else{
  59. ret = {
  60. name: 'getAge',
  61. code: 1,
  62. time: random
  63. };
  64. reject(ret);
  65. }
  66. },500);
  67. });
  68. },
  69. getAddr: function(){
  70. return new Promise(function(resolve,reject){
  71. log('getAddr request start...')
  72. setTimeout(function(){
  73. log('getAddr request complete!')
  74. let random = Math.random();
  75. let ret = null;
  76. if(random > 0.2){
  77. condition.addr = 'shenzhen';
  78. ret = {
  79. code: 0,
  80. time: random
  81. };
  82. resolve(ret);
  83. }
  84. else{
  85. ret = {
  86. name: 'getAddr',
  87. code: 1,
  88. time: random
  89. };
  90. reject(ret);
  91. }
  92. },500);
  93. });
  94. }
  95. }
  96. /**
  97. * 串行promise
  98. * 任一环节的then执行reject都会导致执行链直接跳到catch
  99. * then的执行取决于前面then是否执行的resolve
  100. */
  101. var promise = new Promise(function(resolve,reject){
  102. resolve();
  103. });
  104. promise.then(func.getName)
  105. .then(func.getAge)
  106. .then(func.getAddr)
  107. .then(function(){
  108. write(condition);
  109. })
  110. .catch(function(res){
  111. log(res.name + ' failed!');
  112. console.log(condition);
  113. });
  114. /**
  115. * 并行promise
  116. * 任一函数执行reject都会执行catch
  117. * 当所有函数都执行resolve才会执行then
  118. * 某一函数执行reject并不影响其他函数的执行
  119. */
  120. Promise.all([func.getName(),func.getAge(),func.getAddr()]).then((res) => {
  121. console.log(res);//返回的是三个函数执行返回的结果组成的数组;只有当三者均执行成功时才会返回结果
  122. console.log(condition);
  123. }).catch((res) => {
  124. console.log(res)//当某个函数执行失败时,返回对应的返回参数;任意一个函数执行失败均会返回结果。但不影响其他函数的执行
  125. console.log(condition);
  126. console.log(res.name + ' falied!')
  127. })
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注