很难理解Promise.resolve()和promise链之间的区别

时间:2018-05-05 08:12:22

标签: javascript promise

我很难理解使用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);
})

请我稍微解释一下上下方面的缺点和好处,我非常感谢你的帮助。

谢谢

1 个答案:

答案 0 :(得分:3)

首先,您不需要在requestPromise中构建一个承诺(即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只是打字更多,使其可读性降低,没有语法差异。