Обещания сценариев Java - если оператор возвращает рекомендации - PullRequest
0 голосов
/ 02 июля 2018

Я пишу node.js функцию, которая возвращает различное обещание в зависимости от условия, код:

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 голосов
/ 02 июля 2018

Если вы используете классический (ES6 / ES2015 +) синтаксис Promise, вы должны связать обещания (ничего плохого в этом нет!).

Но у вас также есть возможность разбить код на функции, чтобы получить удобочитаемость и избежать проблем с вложением :

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
  }
}

или смешайте оба раствора.

0 голосов
/ 02 июля 2018

Эслинт говорит мне, что вкладывать обещания - плохая практика.

Просто скажите shut *** up отключите линтер в этом операторе. Обещания имеют возможность быть вложенными точно так, чтобы вы могли вкладывать их, когда вам это нужно, и это один из таких случаев. Ваш код в порядке.

0 голосов
/ 02 июля 2018

Кажется, ты слишком усложняешь это. Метод then уже возвращает обещание, поэтому вам не нужно помещать Promise.resolve в него.

Можно для простоты сделать

return condition
  ? promise.then(() => value)
  : anotherPromise
0 голосов
/ 02 июля 2018

Простое предложение (это должно сработать), передайте условие в аргументе разрешения и отметьте его в блоке затем . Приведенный ниже псевдокод прояснит это лучше:

(() => {
    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
     }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...