Promise.reject()与返回promise.reject()

时间:2018-10-15 16:26:42

标签: javascript node.js promise

我一直试图理解以下两者之间的区别,这是一种闲置的使用方式:

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 :(得分:3)

它们都是不好的例子。

connect()then可用的,因此它大概会返回一个承诺。创建多余的promise除了返回另一个promise的结果外什么都不做,只是使事情变得复杂了。

您可以将整个内容重写为:

let getClient = connect;

...并获得几乎相同的东西(除非您随后要去应用一些奇怪的边缘情况)。


您的第一个示例获取解决连接承诺的结果,创建一个新的承诺,并立即以相同的值对其进行解析,然后返回该连接承诺所采用的那个承诺。

您的第二个示例执行相同的操作,除了未采用之外,因此原始的连接承诺结果在链中的下一个then中可用。 (这些结果与上一个示例中实现额外承诺的结果相同。)

您的第三个示例在对connect的调用之外创建了一个新的Promise,然后使用connect中的值来解决该问题。这是另一个毫无意义的额外承诺。

答案 1 :(得分:-1)

一个好问题。在您的示例中,第一个和最后一个片段产生相同的结果。但是第二个将使您不确定,因为您没有兑现承诺。另外,所需时间/操作顺序也不同。

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));