import { httpGet } from './mock-http-interface'; // Keys accepted by the TResult type type Keys = 'Arnie Quote' | 'FAILURE'; // TResult (array of which to return) type TResult = { [K in Keys]?: string; } // Result returned by the httpGet method type getResult = { status: number, body: string, } // The body of the getResult type, when decoded from json string type getResultBody = { message: string, } /** * Get and parse results from the mock http server * Note: I went a little overboard with the comments, so you know how I was thinking about this * * @param {string[]} url * @return {Promise} */ export const getArnieQuotes = async (urls : string[]) : Promise => { // Array to return let t_results: TResult[] = []; // All needing to resolve before returning (using Promise.all(promises)) let promises: Promise[] = []; // Iterate through all urls for (let url of urls) { // Get the data from the url let promise: Promise = httpGet(url) .then((result: getResult) => { // Determine whether the mock api call was successful let getResultKey: Keys = 'FAILURE'; if (result.status === 200) { getResultKey = 'Arnie Quote'; } // Decode the result_body let result_body: getResultBody = JSON.parse(result.body); // Push the results to the return array t_results.push({ [getResultKey]: result_body.message, } as TResult); // Resolve the promise after we are done return Promise.resolve(); }); // Push the promise to the "promises" array promises.push(promise); } // Wait for all promises to resolve await Promise.all(promises); // Return the data return t_results; };