cqupt-yifanwu / cqupt-yifanwu.github.io

jiaoguibin.top
http://jiaoguibin.top
2 stars 0 forks source link

我不知道的promise #14

Open cqupt-yifanwu opened 7 years ago

cqupt-yifanwu commented 7 years ago

console.log("after new Promise");

p.then(function(value){ console.log(value); });

输出的结果是
"create a promise" 
"after new Promise"
"success" 
- promise在resolve之后 再抛出错误并不会被捕获,等于没有抛出,个人理解是状态改变之后就不会再次改变。

- 错误具有冒泡的特性,会一直向后传递,直到被捕获为止,但是不会冒泡到全局。跟传统的try catch 语句不同的是,如果没有使用catch 语句指定错误处理的回调函数,promise 对象抛出的错误不会传递到外层代码
-  Catch方法返回的还是一个promise 对象,因此后面还可以接着调用then方法,如果没有报错则跳过该catch 方法,需要注意的是,如果在catch 语句以后再抛出错误则无法捕获。
-  done 方法总是出于回调链的微端,保证抛出任何可能出现的错误(向全局)
-  **值穿透**:如果在then方法或是catch方法中传入的不是函数则会穿透,像是没有传入。
- 实现**并行**,不好的做法是使用forEach遍历执行promise,可以使用Promise.all
getAsyncArr().then(promiseArr => {
    return promise.all(promiseArr);
})
.then(res => console.log(res))
```
cqupt-yifanwu commented 7 years ago

关于错误处理,如果

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

错误在promise执行结束之后才会抛出,所以变成一个未被捕获的错误,Node.js有一个unhandledRejection事件,专门监听未捕获的reject错误。

process.on('unhandledRejection', function (err, p) {
  console.error(err.stack)
});

上面代码中,unhandledRejection事件的监听函数有两个参数,第一个是错误对象,第二个是报错的Promise实例,它可以用来了解发生错误的环境信息。