//开始执行 先执行start,
//start 成功后执行step1,
//step1成功后执行step2 ,
//step2成功后执行step3;
//任何一步错误都执行 stepError
//链式串行请求Promise 样例程序
var that=this;
//that.$http 是 aixos 的封装
function step1(r0) {//第一步是一个ajax异步请求
return new Promise(function (resolve, reject) {
that.$http.post("ilab/startX", r0).then((response) => {
var result=response.data;
if(result.success){ resolve(result); //成功进行下一步step2
}else { reject (result); //失败跳转到stepError
}
})
});//Promise
}
function step2(r1){//第二步是一个ajax异步请求
return new Promise(function (resolve, reject) {
that.$http.get('ilab/login?tk='+r1.tk) .then((response) => {
var result=response.data;
if(result.success){ resolve(result); //成功进行下一步step2
}else { reject (result); //失败跳转到stepError
}
});
});//Promise
}
function step3(r2){//第三步同步请求
AppContext.setUser(r2.user);
window.location.href=window.location.href+"&r=0";
//如果需要抛出错误可以这样做
throw {'message':'自定义错误!!' } //这样直接跳转到 stepError
}
function stepError(result) {//处理错误
if(result && result.message){alert(result.message);}
}
启动
var start = new Promise(function (resolve, reject) {
resolve(ps);//传入参数
});
//**********************************************************
start.then(step1).then(step2).then(step3).catch(stepError); <<===========注意这里
//**********************************************************
//等价于
async test1(ps){
try{
const startResult = await start(ps);
const step1Result = await step1(startResult);
const step2Result = await step2(start1Result);
const step3Result = await step3(start2Result);
return step3Result ;
} catch (e){
stepError(e);
}
}
test1();
js Promise 链式串行请求 样例程序
于 2019-08-22 16:55:52 首次发布