为什么用.map()函数解决异步诺言不适用于带有参数的GET?

时间:2019-09-08 16:28:51

标签: mongodb express axios

我不确定如何正确表达我的问题。 基本上,使用.map()函数解决异步诺言仅适用于简单的get函数,而不适用于带有参数的get函数。

在这种情况下,router.get('/' ...基本上可以起到以下作用:

import axios from 'axios'

const url = 'http://localhost:3000/api/library/'

class libraryService {
  // Get stories
  static getStories () {
    return new Promise(async (resolve, reject) => {
      try {
        const res = await axios.get(url)
        const data = res.data
        resolve(
          data.map(story => ({
            ...story
          }))
        )
      } catch (err) {
        reject(err)
      }
    })
  }

export default libraryService

在这种情况下,router.get('/:story_name' ...不能使用此变体:

class readService {
  // Get story to read
  static getStoryToRead (storyName) {
    return new Promise(async (resolve, reject) => {
      try {
        const res = await axios.get(url + storyName)
        const data = res.data
        resolve(
          data.map(selectedStory => ({
            ...selectedStory
          }))
...

在这里,我得到一个错误:“ data.map不是函数”。 更改为data.products.map()将返回错误“无法读取未定义的属性'map'”。

但是,在没有所有情况下都可以使用不具有.map()功能的数据进行解析:

try {
        const res = await axios.get(...)
        const data = res.data
        resolve(
          data
        )
...

为什么会这样?仅使用resolve(data)是否正确?

1 个答案:

答案 0 :(得分:1)

在似乎不起作用的情况下,您似乎想问一个单个故事。因此,假设您得到的只是一个故事,而不是一系列的故事。没有理由尝试使用map

更改最少(但请继续阅读):

// Minimal changes, but keep reading...
static getStoryToRead (storyName) {
  return new Promise(async (resolve, reject) => {
    try {
      const res = await axios.get(url + storyName);
      resolve(res.data);
    } catch (err) {
      reject(err);
    }
  });
}

但是,这两个函数都演示了Promise creation antipattern。您已经已经有了诺言,就可以兑现。在这种情况下,您可以通过制作函数async

static async getStories () {
  const {data} = await axios.get(url);
  return data.map(story => ({ // Why copy the story objects?
    ...story
  }));
}

static async getStoryToRead (storyName) {
  const {data} = await axios.get(url + storyName));
  return data;
}

或具有非async功能:

static getStories () {
  return axios.get(url)
    .then(({data}) => data.map(story => ({...story}))); // Why copy the story objects?
}

static getStoryToRead (storyName) {
  return axios.get(url + storyName))
    .then(({data}) => data);
}