簡體   English   中英

在JavaScript es6中返回Promise

[英]Returning Promise in JavaScript es6

假設我有一個文件從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)
    })
}

這兩種方法有什么區別? 是否有一個首選/更好的錯誤處理方法?

一般來說,兩個方便的規則:

  1. 如果你的起點是一個promise( axios.get的返回值),那么使用new Promise就是一種反模式。 then catch 已經創造了新的承諾。

  2. 傳播錯誤,不要將它們轉換為分辨率(當然,直到處理這些錯誤的點,通常在調用鏈的開頭附近)。

基於此,在這兩個選項中,您將使用版本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...*/);
})

兩個版本沒有真正的區別,在第一個版本中,您創建了一個冗余的Promise

axios.get ,是一個返回Promise的函數,不需要用另一個包裝它。

如果你想改變承諾邏輯,你可以使用額外的Promise扭曲,這意味着如果你想解決無論在axios承諾中發生了什么。 像這樣的東西:

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

但是,通常不是這種做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM