资讯专栏INFORMATION COLUMN

异步编程技巧

崔晓明 / 3189人阅读

摘要:揭示的编程技巧为什么能改善异步编程方法这主要是因为程序员编写程序时,总是按照自己的思考习惯和代码组织习惯编写程序,偏向于同步执行过程。

先看一个例子
var Promise = require("promise-tiny");

new Promise(function(resolve, reject) {    // 注意resolve和reject这两个参数,实际就是then和catch的参数
        var r = Math.random();
        if(r >= 0.5) resolve("success");
        else reject("fail");
    })
   .then(function(value) {        // >=0.5时,调用这个函数
        console.log(value);
    })
   .catch(function(value) {        // <0.5时,调用这个函数
        console.log(value);
    });
promise-tiny的实现代码
class Promise {                // 这段代码主要用于揭示实现原理,对理解异步编程技巧很有帮助
    constructor(factory) {
        this.flag = "Pending";        // flag值域 "Pending","Resolved","Rejected"
        this.args = [];
        this.func = {};

        function next(flag, value) {    // next这个函数是精华,factory没有参数运行起来,全靠它了
            this.flag = flag;
            this.args = [].concat(value);
            this.func[flag] && this.func[flag].apply(undefined, this.args);
        }

        factory(next.bind(this, "Resolved"), next.bind(this, "Rejected"));
    }

    then(func) {
        if(this.flag==="Resolved") func.apply(undefined, this.args);
        else this.func["Resolved"] = func;
        return this;
    }

    catch(func) {
        if(this.flag==="Rejected") func.apply(undefined, this.args);
        else this.func["Rejected"] = func;
        return this;
    }
}
理解了原理,就觉得应该能实现的更好。还是先看一个例子
var Steps = require("promise-tiny/Steps");

class Count {
    constructor() {
        this._step = 0;
    }
    get step() {
        return this._step;
    }
    set step(n) {
        this._step = n;
    }
}

new Steps(new Count)
   .on("Begin", function(next) {
        this.step++;
        next("check", "Begin");
    })
   .on("check", function(next, ...args) {
        this.step++;
        next("create", [].concat(args, "check"));
    })
   .on("create", function(next, ...args) {
        this.step++;
        next("error", [].concat(args, "create"));
    })
   .on("logout", function(next, ...args) {
        this.step++;
        next("End", [].concat(args, "logout"));
    })
   .on("error", function(next, ...args) {
        this.step++;
        next("End", [].concat(args, "error"));
    })
   .on("End", function(next, ...args) {
        this.step++;
        console.log("Steps: "+this.step, "trace: "+[].concat(args, "End").join("->"));

        next("new Steps", { id: "!Count", count: 0 });
    })
   .on("Begin", function(next, ...args) {
        this.count++;
        next("info", [].concat(args, "Begin"));
    })
   .on("info", function(next, ...args) {
        this.count++;
        next("logout", [].concat(args, "info"));
    })
   .on("logout", function(next, ...args) {
        this.count++;
        next("End", [].concat(args, "logout"));
    })
   .on("error", function(next, ...args) {
        this.count++;
        next("End", [].concat(args, "error"));
    })
   .on("End", function(next, ...args) {
        this.count++;
        console.log("Count: "+this.count, "trace: "+[].concat(args, "End").join("->"), this.id);
    });

结果

Steps: 5 trace: Begin->check->create->error->End
Count: 4 trace: new Steps->Begin->info->logout->End !Count

Promise代码体会

带有一个函数参数的函数 f1(f2) ,可以先造一个f2’,这样就可以把它执行了 f1(f2’)。

这个f2’的功能要这样实现:当执行到f2’时,f2’要检查真实的f2是否已经准备好了?如果准备好了,就调用真实的f2;否则,要把调用f2的参数都记下来,等f2准备好时调用。

这样就不需要要求调用f1时,f2必须准备好了。但额外要提供一个提交f2的方法。

以上就是Promise揭示的异步编程技巧。在Promise中,factory是f1;resolve和reject是f2’;then和catch是提交f2的方法。

Promise揭示的编程技巧为什么能改善异步编程方法?

这主要是因为程序员编写程序时,总是按照自己的思考习惯和代码组织习惯编写程序,偏向于同步执行过程。代码的提交次序与机器执行次序有着很大差异!Promise揭示的技巧使程序员能够不用考虑机器的执行次序,给点代码就先执行着,碰到没给的代码就记录下来,等后续代码提交后接着执行。这样,程序员只要保证最终把所有代码都提交就可以了。

应该有更好的实现

既然有这样好的思路,再回头看看Promise的实现,其中缺陷不言而喻。Steps是一次尝试,考虑的问题要比Promise多一些。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87739.html

相关文章

  • js学习之异步处理

    摘要:学习开发,无论是前端开发还是都避免不了要接触异步编程这个问题就和其它大多数以多线程同步为主的编程语言不同的主要设计是单线程异步模型。由于异步编程可以实现非阻塞的调用效果,引入异步编程自然就是顺理成章的事情了。 学习js开发,无论是前端开发还是node.js,都避免不了要接触异步编程这个问题,就和其它大多数以多线程同步为主的编程语言不同,js的主要设计是单线程异步模型。正因为js天生的与...

    VioletJack 评论0 收藏0
  • nodejs异步编程详解

    摘要:四异步编程解决方案模式模式一定程度上缓解了嵌套回调的问题,只会处在未完成完成态失败态中的一种,只会从未完成转化为完成态或者失败态,不能逆转。 一、从一个简单的案例开始 fs.readdir(path.join(__dirname, ./index.js), (err, files) => { files.foreach((filename, index) => { ...

    inapt 评论0 收藏0
  • Javascript中的异步编程

    摘要:接下来,我们一起来看看中的异步编程,具体有哪几种。实现异步编程的方法一回调函数上面不止一次提到了回调函数。它是异步编程中,最基本的方法。四对象接下来,我们聊聊与相关的异步编程方法,对象。 showImg(https://segmentfault.com/img/bVbneWy?w=1600&h=1200); 前言 最近,小伙伴S 问了我一段代码: const funB = (value...

    wemall 评论0 收藏0
  • [ JS 进阶 ] 异步编程 promise模式 的简单实现

    摘要:为了降低异步编程的复杂性,所以。难理解请参考的误区以及实践异步编程的模式异步编程的种方法 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的回调函数,没有阻塞其他代码的执行。还有像setTimeout方法同样也是异步执行回调的方法。 如果对异步编程...

    svtter 评论0 收藏0
  • 【Node Hero】3. 理解异步编程

    摘要:异步编程在传统编程实践中,大多数操作都是同步发生的。中的异步编程异步是一种输入输出处理的形式,它允许在传输完成之前,其它处理能继续进行。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...

    kevin 评论0 收藏0
  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<