触及轮回挪用的异步编程技能

先看题目

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://segmentfault.com/a/1190000004944781
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞