Promise.reject () против возврата - PullRequest
0 голосов
/ 15 октября 2018

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

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 ]

0 голосов
/ 15 октября 2018

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

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));
0 голосов
/ 15 октября 2018

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

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

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

let getClient = connect;

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


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...