1.
let promise = new Promise(function(resolve, reject){
console.log('Promise');
resolve();
});
//then 指定的回调函数将在当前脚本所有同步任务执行完成之后才会执行,所以Resolve最后输出
promise.then(function(){
console.log('Resolve');
});
console.log('Hi');
Hi
app.
js:
10
Resolve
2.
//
let p1 = new Promise(function(resolve, reject){
setTimeout(() => reject(new Error('fail')), 3000);
});
//p2里面进行了resolve(p1),需要等待p1操作完毕
var p2 = new Promise(function(resolve, reject){
setTimeout(() => resolve(p1), 1000);
});
//
p2
.then(result => console.log(result))
.catch(error => console.log(error));
Error:
fail
3.
new Promise((resolve, reject) => {
resolve(1); //立即resolve的Promise是在本轮事件循环的末未执行,总是晚于本轮循环的同步任务
console.log(2);
}).then(
r => {
console.log(r);
}
);
2
1
4.
let promise = new Promise((resolve, reject) => {
resolve('ok');
/**
* Promise在resolve语句后面再抛出错误,并不会捕获,等于没有抛出
* 因为Promise的状态一旦改变,则会永远保持该状态,不会再改变了
*/
throw new Error('test');
});
promise
.then(value => {
console.log(value);
})
.catch( error => {
console.log(error);
});
ok
5.没按照预期执行,没捕捉到错误
var promise = new Promise((resolve, reject) => {
resolve('ok');
/**
* 这个setTimeout抛出错误,是在下一轮EventLoop中抛出的,此时Promise已经执行完毕,这个错误会冒泡到最外层,成为未捕捉错误
* 可以用process.on('unhandledRejection', xxx)捕捉错误
*/
setTimeout(() =>{
throw new Error('test');
}, 0);
});
process.on('unhandledRejection', (err, p) =>{
console.log('fuck error:::');
console.error(err.stack);
});
promise.then(function(value){
console.log(value);
});
ok
main.
js:
20
Error:
test
main.
js:
9
at
Timeout.
setTimeout [
as
_onTimeout] (/
Users/
jianan/
Desktop/
main.
js:
9:
15)
at
ontimeout (
timers.
js:
466:
11)
at
tryOnTimeout (
timers.
js:
304:
5)
at
Timer.
listOnTimeout (
timers.
js:
264:
5)
6.
let someAsyncThing = function(){
return new Promise((resolve, reject) => {
resolve(x + 2);
});
};
someAsyncThing()
.catch(error => {
console.error('error:', error);
})
.then(() => {
console.log('carry on');
});
error:
main.
js:
9
ReferenceError:
x
is
not
defined
main.
js:
9
carry
on
7.
function getFoo(){
return new Promise((resolve, reject) => {
resolve('foo');
});
}
//
var g = function* (){
try{
var foo = yield getFoo();
console.log(foo);
}catch(e){
console.log(e);
}
};
//
function run(generator){
var it = generator();
function go(result){
if(result.done){
return result.value;
}
return result.value.then(value => {
return go(it.next(value));
}, function(error){
return go(it.throw(error));
});
}
go(it.next());
}
//
run(g);
foo