我正在编写一个node.js
函数,该函数根据条件cod返回不同的promise:
if(condition){
return promise.then(() => {
return Promise.resolve(value)
})
}else{
return anotherPromise
}
现在的问题是,如果条件为真,则在实现诺言之后我需要做一些事情,但是在另一种情况下,我只是返回诺言,所以eslint
告诉我,巢承诺。因此此代码对我不起作用:
(() => {
if(condition){
return promise
}
}else{
return anotherPromise
}
}).then(() => {
return Promise.resolve(value)
})
由于使用此代码,在两种情况下将执行then
回调。
处理这种情况的最佳做法是什么?
答案 0 :(得分:1)
如果您使用经典(ES6 / ES2015 +)Promise语法,则必须链接诺言(没什么不好!)。
但是您还可以选择将代码拆分为多个函数,以提高可读性和avoid nesting issues:
const firstCase = () => ... // returning a promise
const secondCase = () => ... // returning a promise
if (condition) {
return firstCase()
} else {
return secondCase()
}
但是对于ES7 / ES2016 +,您可以使用async/await语法:
// in a "async" function
async function main() {
if (condition) {
await promise // if you need the promise result, you can assign it
return value // the result of an async function is always a Promise.
} else {
return anotherPromise
}
}
或混合两种解决方案。
答案 1 :(得分:0)
一个简单的建议(应该可行)在解析的参数中传递条件,并在 then 块中进行检查。下面的伪代码将更好地阐明它:
(() => {
if(condition){
return new Promise((resolve,reject)=>{
//Some tasks
resolve(condition)
//Some reject condition
reject()
})
}
else {
return new Promise((resolve,reject)=>{
//Some tasks
resolve(condition)
//Some reject condition
reject()
})
}
}).then((condition) => {
if(condition) {
//Do something
}
else {
//Do Nothing
}
})
答案 2 :(得分:0)
eslint告诉我,嵌套诺言是不好的做法。
仅告诉它关闭*** 禁用此语句上的短绒即可。承诺具有精确嵌套的能力,因此您可以在需要时嵌套它们,这就是其中一种情况。您的代码很好。
答案 3 :(得分:0)
似乎您已经使它复杂化了。 then方法已经返回了一个Promise,因此您无需在其中放入Promise.resolve。
为简单起见,您可以做
return condition
? promise.then(() => value)
: anotherPromise