Java脚本承诺-如果语句返回最佳做法

时间:2018-07-02 11:08:28

标签: javascript node.js promise

我正在编写一个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回调。

  

处理这种情况的最佳做法是什么?

4 个答案:

答案 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