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'); } } } }
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()