1

promise.then返回的是一个新的 promise 对象

1、如果 then() 方法中抛出了一个异常,那么返回的 Promise 将会变成拒绝状态,value 是异常的 reason,如下例。

new Promise((resolve, reject) => {
    if (true) {
        resolve();
    } else {
        reject();
    }
}).then((data) => {
    resolve();
}, (error) => {
    reject();
})
then 返回的 promise: { 
  [[promiseStatus]]: 'rejected', 
  [[promiseValue]]: 'ReferenceError: resolve is not defined at Promise.then'
}

为什么返回的是这个呢?
因为 resolveundefined,把它当做一个函数去调用当然会报错,所以就算没有 return 任何东西,此时的 then 返回的 promiserejected。而且,一般不能在 Promise.then()中调用 resolvereject,除非你这样写:

new Promise((resolve, reject) => {
    if (true) {
        resolve(resolve); // 将 resolve 传递下去
    } else {
        reject();
    }
}).then((data) => {
    data(); // data 接收了 resolve 函数
})

then() 方法中抛出了一个异常

var promise2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('success');
  }, 2000);
});
promise2.then(function(data) {
  throw new Error('irene')
})
then 返回的 promise: {
  [[PromiseStatus]]: "rejected"
  [[PromiseValue]]: "Error: irene"
}

2、如果 then() 方法中 return【普通】参数值,那么返回的 Promise 将会变成 resolvedvalue 即是 return 的那个数据,如下例。

var promise2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('success');
  }, 2000);
});
promise2.then(function(data) {
    return 2
})
then 返回的 promise: {
  [[PromiseStatus]]: "resolved"
  [[PromiseValue]]: 2
}

3、如果 then() 方法中 return Promise,那这个 Promise 是什么状态,then 返回的就是什么状态,如下例。

var promise2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('success');
  }, 2000);
});
promise2.then(function(data) {
    return new Promise(function(resolve, reject) { // 注意一定要写 return,否则就属于第4种情况了
      reject('把状态置为rejected error'); 
    });
  })
then 返回的 promise: {
  [[PromiseStatus]]: "rejected"
  [[PromiseValue]]: "把状态置为rejected error"
}

4、如果 then() 方法中 return new Error('irene'),那这个 Promiseresolvedvalue 即是 new Error('irene'),如下例。

new Promise((resolve, reject) => {
    if (true) {
        resolve();
    } else {
        reject();
    }
}).then(() => {
  return new Error('irene')
})
then 返回的 promise: { 
  [[promiseStatus]]: 'resolved', 
  [[promiseValue]]: Error: irene
}

5、如果 then() 方法中没有 return 任何东西,那么返回的 Promise 就是接收状态,valueundefined,如下例。

new Promise((resolve, reject) => {
    if (true) {
        resolve();
    } else {
        reject();
    }
}).then(() => {
  console.log('resolve')
})
then 返回的 promise: { 
  [[promiseStatus]]: 'resolved', 
  [[promiseValue]]: undefined
}

6、try-catch 无法捕获 then() 中抛出的错误。因为先执行主线程代码,没有报错,所以 catch 不会打印;再执行微任务,也就是 then() 中的代码,此时报了错,由于主线程代码已经执行结束,所以不会 catch then() 中的报错。可以使用 await 解决这个问题。

try {
  new Promise((resolve, reject) => {
    if (true) {
        resolve();
    } else {
        reject();
    }
  }).then(() => {
    throw new Error('irene')
  })
} catch (err) {
  console.log(err) // 由于无法捕获,所以此处的无法打印
}

Uncaught (in promise) Error: irene
    at <anonymous>:9:11

使用 awaitcatch 中可捕获 then() 中抛出来的错误信息

try {
  var a = await new Promise((resolve, reject) => {
    if (true) {
      resolve();
    } else {
      reject();
    }
  }).then(() => {
    throw new Error('irene')
  })
} catch (err) {
  console.log(err)
}
// catch 中打印出来的信息,此时 a 是 undefined。
Error: irene
    at <anonymous>:9:11
    at async <anonymous>:2

小被子
839 声望10 粉丝

引用和评论

0 条评论