在JavaScript es6中返回Promise

时间:2017-08-29 17:18:58

标签: javascript ajax es6-promise

假设我有一个文件从api导入函数并对结果执行某些操作。

import api from './api'

const getData = () => {
  api.get(url)
    .then(res => console.log(res))
    .catch(err => console.log(err))
}

我看到两种不同的样式用于返回响应,因此错误起泡。

版本1:

get: (url) => {
  return new Promise((resolve, reject) => axios.get(url)
    .then(res => resolve(res))
    .catch(err => reject(err)) )
}

版本2:

get: (url) => {
  return axios.get(url)
    .then(res => {
      if (res.success == 200) {
        return Promise.resolve(res)
      }
      return Promise.reject(res)
    })
}

这两种方法有什么区别?是否有一种首选/更好的错误处理方法?

2 个答案:

答案 0 :(得分:2)

一般来说,有两个方便的规则:

  1. 如果您的起点是承诺(axios.get的返回值),则使用new Promise是反模式。 thencatch 已经创建新的承诺。

  2. 传播错误,不要将它们转换为分辨率(当然,直到您处理这些错误的时刻,通常在调用链的开头附近)。

  3. 基于此,在这两个选项中,您将使用版本2,而不是版本1.

    版本1有点荒谬:它吃分辨率值并将错误转换为分辨率;它将始终解析为undefined。请记住,链的结果是thencatch处理程序中返回(或抛出)的最后一个结果。这两个处理程序不返回或抛出任何东西,因此链解析(而不是拒绝)undefined

    版本2做了一些事情:它根据res.success修改了承诺结果。但它不需要Promise.resolve,它应该只是:

    get: (url) => axios.get(url).then(res => {
      if (res.success == 200) {
        return res;
      }
      return Promise.reject(res); // Or see note below
    })
    

    还有一个阵营 - 我同意 - 它说你应该总是抛出一个Error对象,而不是返回Promise.reject,以获得堆栈跟踪信息。所以:

    get: (url) => axios.get(url).then(res => {
      if (res.success == 200) {
        return res;
      }
      throw new Error(res/*...or something else useful here...*/);
    })
    

答案 1 :(得分:0)

这两个版本没有什么区别,在第一个版本中,您创建的是冗余Promise

axios.get,是一个返回Promise的函数,不需要用另一个函数包装它。

如果你想改变承诺逻辑,你可以使用额外的Promise进行扭曲,这意味着如果你想解决无论在axios承诺中发生了什么。 这样的事情:

get: (url) => {
  return new Promise((resolve, reject) => axios.get(url)
    .then(res => resolve(res))
    .catch(err => resolve(err)) )
}

但是,通常不是这种做法。