如何在对象数组上异步查询 API,然后正确地改变每个对象? (正确使用承诺)
How do I asynchronously query an API on an array of objects and then mutate each object correctly? (Using promises correctly)
我有一系列带有 ID 但没有评级的电影。我想查询电影数据库以获取每部电影的评级,因此我使用 fetch(url)
遍历每个对象以查询 API,然后使用 .then(function(response) { add_rating_to_specific_movie})
。
问题是,.then
是一个异步响应,我无法知道哪部电影具有 return 评级值,以便我可以使用评级来改变正确的电影对象.而且我无法使用 returned 值创建新数组,因为有些电影会 return status: movies not found
,而且我无法知道哪些电影未分级。
可以使用一些关于此处使用 promises 的良好算法的指导。谢谢!
您没有显示您如何迭代电影数组的实际代码,因此我们只能提供一个概念性的答案(下次请显示您的实际迭代代码)。但是,在概念上,您只需使用一个函数为每个数组元素分别传递索引或对象,然后您就可以在 .then()
处理程序中访问该索引或对象。在这种情况下,如果您使用 .forEach()
来迭代您的数组,您正在迭代的对象数组中的对象和该对象的索引都将在一个函数中传递给您,该函数对于每个单独的对象都是唯一可用的请求。
例如,这里有一个可行的概念:
var movies = [....]; // array of movie objects
movies.forEach(function(movie, index) {
// construct url for this movie
fetch(movieURL).then(function(data) {
// use the data to set the rating on movie
movie.rating = ...
});
});
如果您想使用 promises 知道所有请求何时完成,您可以使用 Promise.all()
:
var movies = [....]; // array of movie objects
Promise.all(movies.map(function(movie, index) {
// construct url for this movie
return fetch(movieURL).then(function(data) {
// use the data to set the rating on movie
movie.rating = ...
});
})).then(function() {
// all ratings updated now
});
我有一系列带有 ID 但没有评级的电影。我想查询电影数据库以获取每部电影的评级,因此我使用 fetch(url)
遍历每个对象以查询 API,然后使用 .then(function(response) { add_rating_to_specific_movie})
。
问题是,.then
是一个异步响应,我无法知道哪部电影具有 return 评级值,以便我可以使用评级来改变正确的电影对象.而且我无法使用 returned 值创建新数组,因为有些电影会 return status: movies not found
,而且我无法知道哪些电影未分级。
可以使用一些关于此处使用 promises 的良好算法的指导。谢谢!
您没有显示您如何迭代电影数组的实际代码,因此我们只能提供一个概念性的答案(下次请显示您的实际迭代代码)。但是,在概念上,您只需使用一个函数为每个数组元素分别传递索引或对象,然后您就可以在 .then()
处理程序中访问该索引或对象。在这种情况下,如果您使用 .forEach()
来迭代您的数组,您正在迭代的对象数组中的对象和该对象的索引都将在一个函数中传递给您,该函数对于每个单独的对象都是唯一可用的请求。
例如,这里有一个可行的概念:
var movies = [....]; // array of movie objects
movies.forEach(function(movie, index) {
// construct url for this movie
fetch(movieURL).then(function(data) {
// use the data to set the rating on movie
movie.rating = ...
});
});
如果您想使用 promises 知道所有请求何时完成,您可以使用 Promise.all()
:
var movies = [....]; // array of movie objects
Promise.all(movies.map(function(movie, index) {
// construct url for this movie
return fetch(movieURL).then(function(data) {
// use the data to set the rating on movie
movie.rating = ...
});
})).then(function() {
// all ratings updated now
});