先看题目
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()