【es6】promise

一  . 概念

    resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去

    写法: 

promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

二 . 相关函数

 Promise.prototype.catch() == then(null,rejection)

2.1 Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch语句捕获。
getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 处理前面三个Promise产生的错误
});

2.2 promise 会吃掉错误,如果没有catch方法的错误处理函数,外层代码一样执行,promise对象抛出的错误不会传递到外层代码(与promise无关的外层代码)

const someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    // 下面一行会报错,因为x没有声明
    resolve(x + 2);
  });
};

someAsyncThing().then(function() {
  console.log('everything is great');
});

setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123

好好体味这个:

const promise = new Promise(function (resolve, reject) {
  resolve('ok');
  setTimeout(function () { throw new Error('test') }, 0)
});
promise.then(function (value) { console.log(value) });
// ok
// Uncaught Error: test

Promise 指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体状态结束后抛出的,会冒泡到最外层,成了未捕获的错误

所以,错误抛不抛到最外层,取决于promise状态,状态完成了就抛到外层,状态没完成就吞掉错误,如果有catch就进行捕获。

promise.prototype.finally()

   特点: 不接受参数,无论最后状态如何,都会执行该操作,是一个与状态无关的方法;

3. 对象包装成promise对象

    方式一: promise.resolve();

      1.特别注意参数是一个thenable对象,即实现了then方法的对象。Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

        2.参数不具有then方法,或根本不是对象

            则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。并且会立即执行then方法

const p = Promise.resolve('Hello');

p.then(function (s){
  console.log(s)
});
// Hello



#其他重要概念

   1.Promise 新建后就会立即执行。

     then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行。

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');
  resolve();
});

promise.then(function() {
  console.log('resolved.');
});

console.log('Hi!');    打印:promise hi! resolved

    调用resolvereject并不会终结 Promise 的参数函数的执行,这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务

new Promise((resolve, reject) => {
  return resolve(1);
  // 后面的语句不会执行
  console.log(2);
})


     

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值