【发布时间】:2019-12-16 14:05:38
【问题描述】:
我在地图中使用 Promise 时遇到了一些奇怪的行为。
这本身并不是一个真正的问题,但我想了解发生了什么。
let books = [
{Name: "Moby Dick",
AuthorId: 1
},
{Name: "The Great Gatsby",
AuthorId: 2}
]
let authors = [
{AuthorId: 1,
Name: "Herman Melville"
},
{AuthorId: 2,
Name: "F. Scott Fitzgerald"
}
]
const getAuthorName = (AuthorId) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(authors.find((author) => {
return author.AuthorId === AuthorId
}).Name)
}, 1000
})
}
let responseArray = []
let promises = books.map((book) => (
getAuthorName(book.AuthorId).then((res) => {
responseArray.push({
...book,
AuthorName: res
})
})
))
setTimeout(() => console.log(responseArray), 500)
//I would expect to have to do this:
//Promise.all(promises).then((res) => console.log(res))
我希望
setTimeout(() => console.log(responseArray), 5000)
记录一个空字符串,因为承诺数组尚未通过 Promise.all 运行,但看起来即使地图应该只是返回一个承诺数组,它实际上正在运行承诺。这是为什么呢?
编辑
我已经编辑了 getAuthor 承诺,等待一秒钟,然后再进一步详细说明,因为这不是我想要达到的目的。
我希望对数组进行映射,以返回一个新数组,其中包含映射中返回的任何内容。例如,如果我这样做
let arrayOfPromises = books.map((book) => {
return getAuthor(book.AuthorId)
}
我希望 arrayOfPromises 是一个 getAuthor 承诺的数组。
但是,当我在返回的 Promise 末尾抛出 .then() 时,似乎 .then() 中的代码正在评估。
如果我这样做了
let promises = books.map((book) => {
return getAuthor(book.AuthorId).then((res) => {
console.log(res)
})
}
在控制台中我会看到“Herman Merville”和“F. Scott Fitzgerald”,在 promises 变量中我会看到一系列的 promises。
虽然我认为每个 getAuthor 的 .then 只会在我调用 Promise.all(promises) 时进行评估,因为 getAutor 承诺会在地图内返回。我在这里理解有什么问题吗?
【问题讨论】:
-
承诺就是这样,对未来的承诺。然而,它可能已经发生了。例如,我可以给你
Promise.resolve(5),这是对值 5 的承诺。它已经“运行”了。
标签: javascript