楠哥爱node之nodejs异步操作解决方案 Promise、Generator、async/await

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



猜你喜欢

转载自blog.csdn.net/themagickeyjianan/article/details/80961259