Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Java脚本承诺-如果语句返回最佳实践_Javascript_Node.js_Promise - Fatal编程技术网

Javascript Java脚本承诺-如果语句返回最佳实践

Javascript Java脚本承诺-如果语句返回最佳实践,javascript,node.js,promise,Javascript,Node.js,Promise,我正在编写一个node.js函数,它根据条件返回一个不同的承诺,即cod: if(condition){ return promise.then(() => { return Promise.resolve(value) }) }else{ return anotherPromise } 现在的问题是,如果条件为真,我需要在承诺兑现后做些什么,但在另一种情况下,我只是返回承诺,因此eslint告诉我,嵌套承诺是一种不好的做法。所以这个代码对我不起作

我正在编写一个
node.js
函数,它根据条件返回一个不同的承诺,即cod:

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)
})
因为使用此代码,
然后将在这两种情况下执行
回调

处理此案件的最佳做法是什么?

一个简单的建议,(这应该有效)在resolve的参数中传递条件,并在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
     }
})
埃斯林特告诉我,承诺是一种不好的做法


告诉它闭嘴,把这句话的过梁关掉。承诺具有精确嵌套的能力,因此您可以在需要时嵌套它们,这就是其中之一。你的代码很好。

看起来你把它复杂化了。then方法已经返回了一个承诺,因此您不需要在其中放入promise.resolve

为了简单起见,你可以这样做

return condition
  ? promise.then(() => value)
  : anotherPromise
如果您使用经典的(ES6/ES2015+)承诺语法,那么您必须链接承诺(没什么不好的!)

但您也可以选择将代码拆分为函数,以获得可读性和:

但在ES7/ES2016+中,您可以使用以下语法:


或者混合使用这两种解决方案。

切换到
async/await
是一种选择吗?上面的
Promise.resolve(value)
真的是代码的一部分,还是仅仅是其他逻辑的占位符?如果它是代码的一部分,为什么不在该点返回
value
?实际上没有必要包装它。只要编写你需要的js并编译成你的目标需要的任何东西,你可以使用任何javascript编译器,如果你想使用typescript,也可以只使用typescript编译器。正如@Sirko提到的,async wait作为一个选项可能是最好、最舒适的解决方案。@AmeerTaweel。如果您想播放一些预设(您需要添加ES2017预设),请转到此处:。只需编写代码,点击transform并检查它是如何转换的。我不确定您的代码解决了什么问题。承诺仍然是嵌套的。我们关注的是你问题的这一部分“现在的问题是,如果条件是真的,我需要在承诺兑现后做点什么,但在另一种情况下,我只是返回承诺。”对不起,我无法理解你所说的承诺仍然嵌套是什么意思。@RajaNandSharma你没有真正更改代码中的任何内容。实际上,我猜第一种解决方案使代码更具可读性。(因为我不能使用
async/await
)我知道这不会影响代码性能,但我正在尝试使用可读性和干净代码的最佳实践。@AmeerTaweel如果控制流需要嵌套,那么嵌套没有错。正是出于这个原因,承诺被设计成可嵌套的。如果您想要干净(但冗长)的代码,请将内部回调分解成一个额外的命名函数。如果您想要可读的代码,请使用
async
/
wait
,但在您的评论中,您说您不能这样做。实际上,我想创建一个额外的函数只是为了可读性,这是最好的解决方案,我知道,在嵌套承诺时,代码将完美工作,但是eslint不断地向我展示这个恼人的警告,所以我想知道什么是更好的方法。
const firstCase = () => ... // returning a promise
const secondCase = () => ... // returning a promise

if (condition) {
  return firstCase()
} else {
  return secondCase()
}
// 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
  }
}