我一直试图理解以下两者之间的区别,这是一种闲置的使用方式:
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有所不同?
答案 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));