即使在全局范围中声明了变量(具有指定值:对象),我也得到了 未定义 :
想法是获取相关的键/值对收入,然后以正确的顺序将其推回到主对象(默认情况下没有),从而将收入[0]推入数据。 [0]。我在做什么错了?
//Web-scraping data
const mainURL = 'https://api.themoviedb.org/3/discover/movie?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US&sort_by=revenue.desc&include_adult=false&include_video=false&page=1';
const movieBaseURL = 'https://api.themoviedb.org/3/movie/335?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US';
const apiKey = '2339027b84839948cd9be5de8b2b36da';
let revenue, data, response, obj;
let ID_Array = [], keyValueArr = [], allKeyValueArr = [], objectArr = [];
let text = '';
//Get main object for d3 visualisation
(getMovieList = async() =>{
try {
response = await fetch(mainURL);
data = await response.json();
console.log(data);
console.log(data.results[0].title);
//get movie ID's
ID_Array = [].concat.apply([], data.results.map(d => d.id))
console.log(ID_Array);
getRevenueByID(ID_Array);
console.trace(getRevenueByID);
console.table(allKeyValueArr);
//inject revenue key/value
Object.keys(data.results).forEach(key => {
console.log('The name of the current key: ', key);
console.log('The value of the current key: ', data.results[key]);
data.results[key]['revenue'] = obj;
});
console.log(data);
} catch (error) {
console.log(error);
}
})();
//Retrieve revenue key/value pairs by movie ID's
getRevenueByID = async (arr) => {
for (let i = 0; i < arr.length; i++){
console.count('Count');
console.log('ID is: ', arr[i]);
getRevenueURL = await fetch('https://api.themoviedb.org/3/movie/' + arr[i] + '?api_key=' + apiKey + '&language=en-US');
let data = await getRevenueURL.json();
console.log('data received: ',data);
//return key/value array
keyValueArr = Object.entries(data)[16];
console.table(keyValueArr);
allKeyValueArr.push(keyValueArr);
//convert key/value array to object
obj = Object.assign(...allKeyValueArr.map(d => ({[d[0]]: d[1]})));
console.log('object is: ',obj);
}
};
答案 0 :(得分:1)
您需要在L:27中await getRevenueByID(ID_Array)
,否则getMovieList
在获取附加数据之前会继续。
您可能想要这样做,因此需要将L:35更改为data.results[key]["revenue"] = obj['revenue'];
这是沙箱:https://codesandbox.io/s/6zzo9yrz9z
您可能希望将其他数据提取到一个对象中,然后将其与初始数据合并。这将使代码更容易理解。从异步计算分配给全局变量很难推理。
为了提高性能,您可以并行获取每个条目的附加数据,类似于以下内容:
Object.keys(data.results).forEach(key => {
data.results[key]["revenue"] = getRevenue(key);
});
是否需要await getRevenue(key)
取决于结果的处理方式。
答案 1 :(得分:1)
只需添加三行更改即可解决此问题。 My CodePen
await
将结果保存在async
操作的变量中。obj = await getRevenueByID(ID_Array);
revenue
节点的适当值分配给相应的结果result object
。data.results[key]['revenue'] = obj[data.results[key].id]['revenue'];
revenue
循环时,为其id
节点分配相应的for(;;)
API响应。将整个响应对象返回到主函数。
resObj[arr[i]] = obj;
return resObj;
请参阅我的代码笔以获取解决方案: https://codepen.io/aaadesh/pen/LaGLRe?editors=0010
注意全局声明和吊装效果。
快乐编码!