Llamo a una API y obtengo el total_tweet_count. Si la metaetiqueta contiene un next_token, busco la siguiente API (aquí llamo al objeto correspondiente) con el next_token y empujo el total_tweet_count a una matriz. Sin embargo, si la respuesta no contiene un next_token, dejo de iterar y simplemente presiono total_tweet_count y devuelvo la matriz. Por alguna razón, el código no parece ejecutarse. Por favor ayuda.
El siguiente ejemplo debería obtener el next_token de res1 y llamar a res2 e insertar el tweet_count en la matriz. Luego, usando el next_token de res2, obtenga los datos de res3 y presione el conteo. Dado que res3 no tiene un next_token, finalizamos el ciclo y devolvemos los datos. Esta es la expectativa. Por favor aconséjame.
const getData = async () => { const totalCount = []; const results = await Promise.resolve(data.res1); totalCount.push(results.meta.total_tweet_count) do { const results1 = await Promise.resolve(data[`res${results.meta.next_token}`]); totalCount.push(results1.meta.total_tweet_count) } while (results.meta.next_token) return totalCount; } getData().then(res => console.log(res))El resultado final que espero es [1,20, 8]
Por favor aconséjame.
Enlace de violín: https://jsfiddle.net/czmwtj3e/
Su condición de bucle es constante:
const results = await Promise.resolve(data.res1); //^^^^^^^^^^^^^ … do { … } while (results.meta.next_token)lo que buscas es
const getData = async () => { const totalCount = []; let results = await Promise.resolve(data.res1); totalCount.push(results.meta.total_tweet_count) while (results.meta.next_token) { results = await Promise.resolve(data[`res${results.meta.next_token}`]); totalCount.push(results.meta.total_tweet_count) } return totalCount; }o
const getData = async () => { const totalCount = []; let results = {meta: {next_token: 1}}; do { results = await Promise.resolve(data[`res${results.meta.next_token}`]); totalCount.push(results.meta.total_tweet_count) } while (results.meta.next_token) return totalCount; } Observe que no hay const results1 en ninguno de estos, sino una asignación a la variable de results mutables.
Por lo que yo puedo decir:
getData() es un proceso totalmente síncrono que actúa sobre data , por lo que no necesita ser una asyncFunction ..next_token (a menos que tenga algún significado secreto más allá de lo que se ha explicado en la pregunta). const getData = () => { const keys = Object.keys(data); // array ['res1', 'res2', 'res3'] const totalCounts = keys.reduce((arr, key) => { // iterate the `keys` array with Array.prototype.reduce() arr.push(data[key].meta.total_tweet_count); // push next tweet count onto the array return arr; // return `arr` to be used in the next iteration }, []); // start the reduction with empty array return totalCounts; // [1, 20, 8] };En la práctica, usted:
data a la función const getData = (data) => { return Object.keys(data).reduce((arr, key) => { arr.push(data[key].meta.total_tweet_count); return arr; }, []); };