Promise

作者: JasonQiao | 来源:发表于2017-04-15 21:44 被阅读13次

    作用:取代event和callback

    创建unsettled Promise
    new Promise(function(resolve, reject){
    //code goes here
    })

    创建settled Promise
    Promise.resolve()
    Promise.reject()
    如果给这两个方法传递一个Promise,那就原封不动返回。
    非Promise thenable可以传递给上面两个方法,用来兼容老的JS库。

    Promise schedule jobs to be added to the Javascript engine's job queue for future execution, and a second job queue tracks promise fulfillment and rejection handlers to ensure proper execution.
    Promise三种状态:pending, fulfilled, rejected

    Promise.then():可以绑定一个fulfillment handler和一个rejection handler。
    Promise.catch():只绑定一个rejection handler。

    链式操作
    Promise.then和Promise.catch均返回Promise,可以链式操作。

    Global Promise Rejection Handler
    对于Promise,可以不绑定rejection handler,这就埋下了隐患,为此可以建立一个全局Promise Rejection Handler。

    响应多个Promise
    Promise.all():给定的所有promise全都fulfilled,返回的promise才fulfilled,如果遇到一个rejected的则返回的promise直接rejected。
    Promise.race():给定的所有promise第一个fulfilled,则返回的promise也fulfilled,如果第一个rejected,则返回的promise也rejected。

    Promise与Generator结合处理异步任务

    let fs = require("fs");
    function run(taskDef) {
        // create the iterator
        let task = taskDef();
        // start the task
        let result = task.next();
        // recursive function to iterate through
        (function step() {
            // if there's more to do
            if (!result.done) {
                // resolve to a promise to make it easy
                let promise = Promise.resolve(result.value);
                promise.then(function(value) {
                    result = task.next(value);
                    step();
                }).catch(function(error) {
                    result = task.throw(error);
                    step();
                });
            }
        }());
    }
    // define a function to use with the task runner
    function readFile(filename) {
        return new Promise(function(resolve, reject) {
            fs.readFile(filename, function(err, contents) {
                if (err) {
                    reject(err);
                } else {
                    resolve(contents);
                }
            });
        });
    }
    // run a task
    run(function*() {
        let contents = yield readFile("config.json");
        doSomethingWith(contents);
        console.log("Done");
    });
    

    ES2017中Async与Await

    相关文章

      网友评论

          本文标题:Promise

          本文链接:https://www.haomeiwen.com/subject/okdoattx.html