资讯专栏INFORMATION COLUMN

涉及循环调用的异步编程技巧

imtianx / 1542人阅读

摘要:先看问题第二次失败,重新登录这只表示算法,并不能执行第一次执行失败,重试这只表示算法,并不能执行使用解决实例可以运行的。

先看问题
login_label: login(user, pass, function(result) {
    doSomeThing_label: doSomeThing(result, function(err) {
        switch(err) {
        case "disconnect":  // 第二次失败,重新登录
            goto login_label;  // 这只表示算法,并不能执行
        case "retry":  // 第一次执行失败,重试
            goto doSomeThing_label;  // 这只表示算法,并不能执行
        default:
            logout(function() {
                console.log("finish");
            }
        }
    }
}
使用Steps解决实例(可以运行的。例子中有没有异步过程都不是问题,不信的可以自己改改验证)
var Steps = require("promise-tiny/Steps");

new Steps({
    user: "foo",
    pass: "foolish",
    loginCount: 0,
    doSomeThingCount: 0
}) .on("Begin", function(next) {    // 从这里开始
        next("login", [this.user, this.pass]);
    })
   .on("login", function(next, user, pass) {
        console.log("login(""+user+"", ""+pass+"")");

        this.loginCount++;

        var result = true;    // 假设login总能成功
        console.log("    第"+this.loginCount+"次login成功");
        console.log();
        next("doSomeThing", "一些要做的事情...");
    })
   .on("doSomeThing", function(next, ...args) {
        console.log("doSomeThing(""+args+"")");

        this.doSomeThingCount++;

        if(this.doSomeThingCount === 1) {    // 假设第一次做不成功,重试一次
            console.log("    第"+this.doSomeThingCount+"次doSomeThing失败,再试一次");
            next("doSomeThing", args);
        }
        else if(this.loginCount === 1) {    // 假设第二次做不成功,重新login
            console.log("    第"+this.doSomeThingCount+"次doSomeThing失败,重新login");
            next("login", [this.user, this.pass]);
        }
        else {
            console.log("    第"+this.doSomeThingCount+"次doSomeThing完成了,要退出了");
            next("logout");
        }
        console.log();
    })
   .on("logout", function(next) {
        console.log("logout()");
    })

运行结果

login("foo", "foolish")
    第1次login成功

doSomeThing("一些要做的事情...")
    第1次doSomeThing失败,再试一次

doSomeThing("一些要做的事情...")
    第2次doSomeThing失败,重新login

login("foo", "foolish")
    第2次login成功

doSomeThing("一些要做的事情...")
    第3次doSomeThing完成了,要退出了

logout()

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

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

相关文章

  • python基础教程:异步IO 之编程例子

    摘要:创建第一个协程推荐使用语法来声明协程,来编写异步应用程序。协程两个紧密相关的概念是协程函数通过定义的函数协程对象调用协程函数返回的对象。它是一个低层级的可等待对象,表示一个异步操作的最终结果。 我们讲以Python 3.7 上的asyncio为例讲解如何使用Python的异步IO。 showImg(https://segmentfault.com/img/remote/14600000...

    wangxinarhat 评论0 收藏0
  • 异步流程之Promise解析

    摘要:采用链式的,可以指定一组按照次序调用的回调函数。异步操作成功异步操作成功上面代码中,第一个方法指定的回调函数,返回的是另一个对象。这时,第二个方法指定的回调函数,就会等待这个新的对象状态发生变化。方法是的别名,用于指定发生错误时的回调函数。 好久没有更新文章了,最近刚好遇到考试,而且一直在做数据库课设。 本来这篇文章是上个星期想要分享给工作室的师弟师妹们的,结果因为考试就落下了。 其实...

    luoyibu 评论0 收藏0
  • node - 非阻塞异步 IO

    摘要:而线程是进程的一部分,二者相扶相依,其中单线程被称为轻权进程或轻量级进程,执行特性线程只有个基本状态就绪,执行,阻塞。以上所述证明了操作与其他函数的这种区别是由实现,是用多线程的方式,在标准的阻塞式上模拟非阻塞异步,线程池默认限制四线程。 node - 非阻塞的异步 IO 每当我们提起 node.js 时总会脱口而出 事件驱动、非阻塞I/O 和 单线程,所以我总结了以下几点对这三项概念...

    yuxue 评论0 收藏0
  • node - 非阻塞异步 IO

    摘要:而线程是进程的一部分,二者相扶相依,其中单线程被称为轻权进程或轻量级进程,执行特性线程只有个基本状态就绪,执行,阻塞。以上所述证明了操作与其他函数的这种区别是由实现,是用多线程的方式,在标准的阻塞式上模拟非阻塞异步,线程池默认限制四线程。 node - 非阻塞的异步 IO 每当我们提起 node.js 时总会脱口而出 事件驱动、非阻塞I/O 和 单线程,所以我总结了以下几点对这三项概念...

    keelii 评论0 收藏0

发表评论

0条评论

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