【问题标题】:Hard time understanding difference between Promise.resolve() and promise chain很难理解 Promise.resolve() 和 Promise 链之间的区别
【发布时间】:2018-10-15 16:02:37
【问题描述】:

我很难理解使用 Promise.resolve() 和简单使用 Promise 之间的区别。

这个解释似乎有点难以理解,所以我举个小例子:

例如,我有一个方法可以返回这样的承诺:

requestPokemon() {
  return new Promise((resolve, reject) => {
    axios.get("https://pokeapi.co/api/v2/pokemon/1").then(value => {
      resolve(value);
    })
    .catch(error => {
      reject(error);
    })
  });
}

所以,现在我可以调用这个方法并链接承诺,我想出了两种方法,当 Promise.resolve 更好与否时无法获得它,我的问题是理解这一点。

所以我通过两种方式解决了它:

第一:

Promise.resolve(this.requestPokemon()).then(value => {
  this.pokemon = value.data.name;
}).catch(error => {
  console.log(error);
})

秒:

this.requestPokemon().then(value => {
  this.pokemon = value.data.name;
}).catch(error => {
  console.log(error);
})

请我稍微解释一下这样做的优缺点,我非常感谢您的帮助。

谢谢

【问题讨论】:

  • 当你不知道this.requestPokemon() 是否会返回一个promise,而你仍然想.then() 时,你只需要Promise.resolve

标签: javascript promise


【解决方案1】:

一开始你不需要在你的requestPromise中构造一个promise(那是一个antipattern),只需从axios返回一个:

  requestPokemon() {
    return axios.get("https://pokeapi.co/api/v2/pokemon/1");
 }

现在让我们看看这一行:

 Promise.resolve(this.requestPokemon()).then(/*...*/)

它将创建一个新的 Promise,当 axios Promise 解析或拒绝时,它会解析或拒绝,并向其添加 then 处理程序。所以它会像这样被链接起来:

 resolve() -> Promise (axios) -> Promise (Promise.resolve) -> then
 reject() -> Promise (axios) -> Promise (Promise.resolve) -> catch

所以你可以看到Promise.resolve 只是传递数据,所以实际上它是多余的。我们实际上只需要:

 resolve() -> Promise (axios) -> then
 reject() -> Promise (axios) -> catch

可以通过以下方式完成:

 this.requestPokemon().then(/*...*/, /*...*/);

请我稍微解释一下这样做的优缺点

添加Promise.resolve 只是输入更多,可读性降低,语法上没有区别。

【讨论】:

  • 所以使用 Promise 构造函数的调用几乎从未完成?只是在 api 调用中不是这样吗?
  • 如果我执行 Promise.resolve 我可以返回承诺并将其与 then 链接并捕获,但这对我来说很奇怪,因为我调用了 Promise.resolve() 我假设承诺将被解决并且不会失败?
  • @af 是的,如果你想包装一个回调,你只需要new Promise。不,如果你解决了一个承诺(resolve(promise)Promise.resolve(promise)),它将被压扁,所以 tue 外部承诺将做内部承诺。
  • 知道了,谢谢,让我感到困惑的另一件事是 Promise.resolve 和 Promise.reject,如果我调用其中一个,例如 Promise.resolve 我在解析中传递的参数,例如一个承诺应该总是被解决?没有错误?
  • @af 如果不是承诺,那么是的。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2016-12-07
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多