我不确定如何正确表达我的问题。 基本上,使用.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)
是否正确?
答案 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);
}