Object.assign returns 未定义

Object.assign returns undefined

即使在全局范围内声明了一个变量(赋值:对象),我得到的是 undefined:

我们的想法是获得相关的 key/value 对收入,然后以正确的顺序将其推回主要对象(因为默认情况下它没有),因此收入 [0] 被推到 data.results[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);
        }
    };

您需要在 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) 取决于您处理结果的方式。

只需添加三行更改即可解决此问题。 My CodePen

  1. await 将结果保存在 async 动作的变量中。
obj = await getRevenueByID(ID_Array);
  1. revenue 节点的适当值分配给相应的结果 result object
data.results[key]['revenue'] = obj[data.results[key].id]['revenue'];
  1. 分配相应的 revenue API 响应,因为您正在使用 for(;;) 循环。 Return 对主函数的整个响应对象。

resObj[arr[i]] = obj;

return resObj;

参考我的码笔解决方法: https://codepen.io/aaadesh/pen/LaGLRe?editors=0010

注意全局声明和提升效果

编码愉快!!!