function sum(a, b, cb) {
  cb(a + b);
}
// sum(111, 222, (result) => {
//   console.log(result);
//   console.log(111);
// });
// 异步调用必须要通过回调函数来返回数据 进行复杂调用会出现回调地狱
/**
 * 问题 异步必须通过回调函数返回结果 回调函数一多出现问题
 * promise解决问题
 * promise:用来存储数据的一个容器 拥有一套特殊的存取数据的方式
 *          使得它可以存储异步调用结果
 */

// 创建promise
// 创建promiSee需要一个函数作为参数
// promise构造函数的回调函数会在创建promise时调用
// 调用时会有两个参数
// const promise = new Promise((resolve, reject) => {
//     // resolve reject 是两个函数 可以向promise中存数据
//     // resolve 在执行正常是存储数据 reject在执行错误是存储数据
//     // 通过函数向promise添加数据好处就是可以用来添加异步调用的数据
//     // resolve('resolve')
//     // throw new Error(111);
//     reject('reject')

// })

// 从promise中读取数据
// 可以通过promise实例方法then来读取promise中存储的数据
// then需要两个回调函数作为参数 用来获取promise中的数据
// 通过resolve存的数据会掉用地一个函数 可以在第一个函数中写处理数据的代码
// 通过reject存储的数据或者出现异常时会调用第二个函数 可以在这写处理又一场的代码

// promise.then((result)=>{
//     console.log(result);
// },(reason)=>{
//     console.log(reason);
// })

// promise中有两个隐藏的属性
// PromiseResult:存的数据
// PromiseState:记录promise状态 只会改变一次
/**
 * fulfilled
 * rejected
 * pending
 *
 *
 * 流程 当promise创建时PromiseState初始值为pending
 * 当通过resolve变为fulfilled调用then的第一个回调函数
 * 当通过reject或出错时 变为rejected PromiseResult变为异常对象调用then的第二个回调函数
 *
 * 当我们通过then读取数据时相当于为promise设置两个回调函数
 */

const promise2 = new Promise((resolve, reject) => {
  resolve("haha");
});

// console.log(promise2);
// promise2.then(result=>{
//   console.log(result)
// },reason=>{
//   console.log(reason);
// })
// catch与then类似但是只有一个回调函数
//     只会在rejected时执行 相当于.then(null,()=>{})
//
// promise2.catch(reason=>{

// })
// finally() 无论是reject或resolve都执行回调 但都不会接收到数据 
promise2.finally(() => {
  console.log("nothing stops me");
});





/**
 * promise静态方法
 *  Promise.resolve()创建一个立即完成的promise
 *  Promise.reject(10)创建一个立即拒绝的promise
 * Promise.all() 有一个报错就会返回错误
 * Promise.allSettled() 无论错误与否都返回
 *     [
       { status: 'fulfilled', value: 579 },
       { status: 'rejected', reason: 'hahah' },
       { status: 'fulfilled', value: 46 },
       { status: 'fulfilled', value: 22 }
       ]
    Promise.race() 返回最快的Promise对象
    Promise.any()返回最快的完成的Promise对象 都报错才会catch
 */
function sum(a, b) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(a + b);
    }, 1000);
  });
}

// Promise.allSettled().then((r) => console.log(r));

Promise.any([sum(123, 456), sum(12, 34), sum(11, 11)])
  .then((r) => console.log(r))
  .catch((r) => console.log(r));


标签: none

添加新评论