Búsqueda de sitios web

javascript - console.log devuelve una promesa pendiente, no los datos reales


Entonces tengo este archivo:

 'use strict'
import * as moment from "moment";
import { Report} from "./Report";
import { Timeframe} from "./Timeframe";
import { ReportComparison } from "./ReportComparison";

function test(firstFrom: string, firstTo: string, secondFrom: string, secondTo: string) {


    var pastReport = new Report(new Timeframe(moment(firstFrom), moment(firstTo)));
    var laterReport = new Report(new Timeframe(moment(secondFrom), moment(secondTo)));

    var reportComparison

    function getData(pastReport: Report, laterReport: Report) {

        var later = function() {
            return new Promise((resolve, reject) => {
                laterReport.fetchData(data => resolve(data));
            });
        };

        var past = function() {
            return new Promise((resolve, reject) => {
                pastReport.fetchData(data => resolve(data));
            });
        };

        return Promise.all([later(), past()]).then(() => {
            laterReport.sort();
            reportComparison = new ReportComparison(pastReport, laterReport);

            return {
                pastReport: {
                    projects: reportComparison.pastReport.projects,
                    timeFrame: reportComparison.pastReport.timeframe,
                    totalAutomatedRuns: reportComparison.pastReport.totalAutomatedRuns,
                    totalManualRuns: reportComparison.pastReport.totalManualRuns

                },
                laterReport: {
                    projects: reportComparison.laterReport.projects,
                    timeFrame: reportComparison.laterReport.timeframe,
                    totalAutomatedRuns: reportComparison.laterReport.totalAutomatedRuns,
                    totalManualRuns: reportComparison.laterReport.totalManualRuns
                },
                trends: reportComparison.trends
            }

        });

    }

    return getData(pastReport, laterReport).then((res) => {
        return res;
    });

}



console.log(test("20170707", "20170707", "20170710", "20170710"))

En este momento, el console.log devuelve Promise { <pending> } y no el valor real que quiero que se devuelva (el objeto JSON). ¿Estoy abordando correctamente este código asíncrono? ¿Qué solución podría usar para devolver el JSON como un valor, no como una promesa pendiente?

Respuesta #1

El método test efectivamente devuelve una promesa. Para acceder a los datos, llama a la función .then().

test("20170707", "20170707", "20170710", "20170710")
    .then((response) => {
         console.log(response);
    });

Respuesta #2

Sí, recibirás la promesa solo mientras estés devolviendo la promesa desde aquí

return getData(pastReport, laterReport).then((res) => {

    return res; //Do callback here...
});

Este es tu valor de retorno principal, quiero decir, el valor de retorno de la función test y solo has devuelto una promesa y ten en cuenta que lo que hayas devuelto desde then se devolverá solo en esa función, así que no se reflejará en el valor de retorno de test. Si no quieres cambiar tu código, puedes usar un callback.

o cambiarlo a

retornar obtenerDatos(informeAnterior, informePosterior)

y realiza tu llamada de prueba así

test(...).then((res)=>{ 
})
Or like this
var a = await test(...)
then test will return data.

Artículos relacionados