Promise补充

Promise补充
Promise规范
/**
 * promise 的then方法接受两个参数:promise.then(onFulfilled, onRejected)他们都是可选参数,同时他们都是函数,
 *       如果onFulfilled或onRejected不是函数,则需要忽略他们。
 * then方法必须返回一个Promise对象
 *       promise2 = promise1.then(onFulfilled, onRejected);
 *      只要onFulfilled或者onRejected返回一个值x,promise 2 都会进入 onFulfilled 状态
 *      如果onFulfilled或者onRejected抛出一个异常e,则promise2必须拒绝执行,并返回拒因e
 *      如果onFulfilled不是函数且promise1状态变为已完成,promise2必须成功执行并返回相同的值
 *      如果onRejected不是函数且promise1状态变为已拒绝,promise2必须执行拒绝回调并返回相同的据因
 */
var promise1 = new Promise((resolve, reject) => {
  reject();
});
promise1.then(null, function () {
  return 123;
}).then(null, null).then(null, null).then(() => {
  console.log('promise2 已完成');
}, () => {
  console.log('promise2 已拒绝');
});
/**
 * 上边等价于下边格式
 * 解析:
 *     1.首先调用Promise1的reject方法,第一个会执行第二个函数,返回123,它是一个合法的值
 *        那么他就会进入onFulfilled 状态是一个Promise对象
 *     2.Promise2就返回123,保存的onFulfilled状态
 *     3.Promise3两个参数都不是函数被忽略,Promise3于是也保存的Promise2状态
 *     4.同理Promise4也是保留Promise2的状态
 *     5.于是Promise5接受onFulfilled状态打印'promise2 已完成'
 */

let Promise1 = new Promise((resolve, reject) => {
  reject();
})
let Promise2 = Promise1.then(null, function () {
  return 123;
})
let Promise3 = Promise2.then(null, null)
let Promise4 = Promise3.then(null, null)
let Promise5 = Promise4.then(() => {
  console.log('promise2 已完成');
}, () => {
  console.log('promise2 已拒绝');
})
promise解决的过程
/**
 * Promise解决过程,是一个抽象的操作,其需输入一个promise和一个值,
 *   我们表示为[[Resolve]](promise, x)
 */
var promise1 = function () {
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log(1);
      resolve();
    }, 1000)
  });
}
var promise2 = function () {
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log(2);
      resolve();
    }, 2000);
  });
}
promise1().then(function () {
  return promise2(); // 此处返回一个 promise 实例
 }).then(function() {console.log('已完成')}, function() {console.log('已拒绝')});
Promise静态方法
race方法
/**
 *返回一个 promise 实例,接受一个数组,里面含有多个 promise 实例,
 * 当有一个 promise 实例状态改变时,就进入该状态且不可改变。
 * 这里所有的 promise 实例为竞争关系,只选择第一个进入改变状态的promise 的值。
 * 执行结果:
 *   1
 *   已经有一个Promise状态改变了,1
 *   2
 */
var promise1 = function () {
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log(1);
      resolve(1);
    }, 1000)
  });
}
var promise2 = function () {
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log(2);
      resolve(2);
    }, 2000);
  });
}
Promise.race([promise1(), promise2()]).then(function (val) {
  console.log('有一个 promise 状态已经改变', val);
});

有一个代码状态发生改变,就立刻执行,并不是说另外一个Promise不执行中断,而是他的结果已经不重要了,立刻返回当前结果,所以上边代码还是会打印2,不过是在最后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值