【发布时间】:2018-11-22 15:54:37
【问题描述】:
我正在尝试实现以下逻辑的虚拟仿真:
但我不确定我是否完全了解如何做到这一点的最佳做法。
此任务的要点是避免触发冗余的catch 块回调。 IMO 如果第一次请求失败,那么所有以下代码都应该停止。
我的意思是:如果第一次请求失败,那么我们不会发出第二次请求,也不会调用catch 第二次请求承诺块。
简而言之,我正在寻找非常干净和简单的解决方案,如下所示:
firstRequest()
.then(r => {
console.log('firstRequest success', r);
return secondRequest();
}, e => console.log('firstRequest fail', e))
.then(r => {
console.log('secondRequest success', r);
// Should I return something here? Why?
}, e => console.log('secondRequest fail', e));
我已经编写了以下实现。如果两个请求都成功,并且第二个请求失败,它会按预期工作。但是如果第一个请求失败,它就会出错(正如您所看到的 catch 块正在触发)。您可以使用isFirstSucceed 和isSecondSucceed 标志来检查它。
var ms = 1000;
var isFirstSucceed = false;
var isSecondSucceed = true;
var getUsersId = () => new Promise((res, rej) => {
console.log('request getUsersId');
setTimeout(() => {
if (isFirstSucceed) {
return res([1,2,3,4,5]);
} else {
return rej(new Error());
}
}, ms);
});
var getUserById = () => new Promise((res, rej) => {
console.log('request getUserById');
setTimeout(() => {
if (isSecondSucceed) {
return res({name: 'John'});
} else {
return rej(new Error());
}
}, ms);
});
getUsersId()
.then(r => {
console.info('1st request succeed', r);
return getUserById();
}, e => {
console.error('1st request failed', e);
throw e;
})
.then(
r => console.info('2nd request succeed', r),
e => {
console.error('2nd request failed', e);
throw e;
});
我可以将第二个请求的then 移动到第一个请求的then,但它看起来很难看。
var ms = 1000;
var isFirstSucceed = false;
var isSecondSucceed = true;
var getUsersId = () => new Promise((res, rej) => {
console.log('request getUsersId');
setTimeout(() => {
if (isFirstSucceed) {
return res([1,2,3,4,5]);
} else {
return rej(new Error());
}
}, ms);
});
var getUserById = () => new Promise((res, rej) => {
console.log('request getUserById');
setTimeout(() => {
if (isSecondSucceed) {
return res({name: 'John'});
} else {
return rej(new Error());
}
}, ms);
});
getUsersId()
.then(r => {
console.info('1st request succeed', r);
getUserById().then(
r => console.info('2nd request succeed', r),
e => {
console.error('2nd request failed', e);
throw e;
});
}, e => {
console.error('1st request failed', e);
throw e;
})
问题:
- 如何根据所有 Promise 最佳实践来实现所描述的逻辑?
- 是否可以在每个
catch块中避免throw e? - 我应该使用 es6 Promise 吗?还是使用一些 Promise 库更好?
- 还有其他建议吗?
【问题讨论】:
标签: javascript promise es6-promise