Promise.reject () против возврата

1

Я пытался понять разницу между следующими двумя, и это простой способ использования:

let getClient = () => {
    return connect()
    .then((client) => {
        return Promise.resolve(client);
    })
    .catch((err) => {
        return Promise.reject(err);
    }
}

а также

let getClient = () => {
    return connect()
    .then((client) => {
        Promise.resolve(client);
    })
    .catch((err) => {
        Promise.reject(err);
    }
}

а также

let getClient = () => {
    return new Promise((resolve, reject) => {
        return connect()
        .then((client) => {
            resolve(client);
        })
        .catch((err) => {
            reject(err);
        })
    })
}

может кто-нибудь помочь мне понять разницу? Возвращает ли Promise.resove/reject различие только с использованием Promise.resolve/reject?

  • 2
    Второй пример НЕ эквивалентен двум другим, без оператора return вы проглатываете «client» и / или «err».
  • 0
    Также избегайте третьего фрагмента с его антипаттерном конструктора Promise !
Теги:
promise

2 ответа

3

Все они плохие примеры.

connect() then может, поэтому он, по-видимому, возвращает обещание. Создание дополнительных обещаний, которые ничего не делают, кроме как возвращение результатов другого обещания чуть более усложняет ситуацию.

Вы могли бы переписать все это так:

let getClient = connect;

... и получить то, что более или менее идентично (если только вы тогда не поедете и не примените какие-то странные краевые случаи).


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

Ваш второй пример делает то же самое, за исключением без принятия, поэтому исходные результаты обещания соединения доступны в следующем, then в цепочке. (Эти результаты идентичны тем, которые прошли предыдущий пример с дополнительным обещанием).

Ваш третий пример создает новое обещание вне вызова для connect, а затем разрешает это со значением из connect. Это еще одно бессмысленное дополнительное обещание.

  • 0
    «Вы можете переписать все это так: let getClient = connect » Это лучший способ подвести итог. Или, другими словами, не создавайте getClient обертку getClient потому что она на самом деле никак не улучшает connect .
0

Хороший вопрос. В вашем примере первый и последний фрагмент дает тот же результат. Но второй даст вам неопределенное, поскольку вы не возвращаете обещание. Также время, затраченное на выполнение/последовательность операций, отличается.

const connect = (input) => new Promise((res, rej) => (!!input ? res('Success') : rej('Failure')));

    let getClient_0 = (input) => {
        return connect(input)
          .then((client) => {
            return Promise.resolve(client);
          })
          .catch((err) => {
              return Promise.reject(err);
            })
          }

        let getClient_1 = (input) => {
            return connect(input)
              .then((client) => {
                Promise.resolve(client);
              })
              .catch((err) => {
                  Promise.reject(err);
                })
              }

            let getClient_2 = (input) => {
              return new Promise((resolve, reject) => {
                return connect(input)
                  .then((client) => {
                    resolve(client);
                  })
                  .catch((err) => {
                    reject(err);
                  })
              })
            }


            getClient_0(1).then((r) => console.log('getClient_0 -> ',r)).catch(e => console.log('getClient_0 -> ',e));
            getClient_0(0).then((r) => console.log('getClient_0 -> ',r)).catch(e => console.log('getClient_0 -> ',e));
            getClient_1(1).then((r) => console.log('getClient_1 -> ',r)).catch(e => console.log('getClient_1 -> ',e));
            getClient_1(0).then((r) => console.log('getClient_1 -> ',r)).catch(e => console.log('getClient_1 -> ',e));
            getClient_2(1).then((r) => console.log('getClient_2 -> ',r)).catch(e => console.log('getClient_2 -> ',e));
            getClient_2(0).then((r) => console.log('getClient_2 -> ',r)).catch(e => console.log('getClient_2 -> ',e));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню