【问题标题】:console.log returning pending promise, not actual data [duplicate]console.log 返回待处理的承诺,而不是实际数据 [重复]
【发布时间】:2017-12-26 03:52:12
【问题描述】:

所以我有这个文件:

 '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"))

现在,console.log 返回Promise { <pending> },而不是我想要返回的实际值(JSON 对象)。我是否正确处理了这个异步代码?我可以使用什么解决方案将 JSON 作为值返回,而不是未决的承诺。

【问题讨论】:

标签: javascript json typescript asynchronous


【解决方案1】:

是的,只有当你从这里返回承诺时,你才会得到承诺

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

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

这是你的主要返回,我的意思是测试函数的返回值,你只返回了 Promise,并注意你返回的内容只会在该函数中返回,因此它不会反映在测试的返回值中。 如果您不想更改代码,可以使用回调

或者改成

return getData(pastReport, laterReport)

并像这样进行测试调用

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

【讨论】:

  • 这实际上并不能解决我的问题。我希望 test 实际上是 json 对象。您的解决方案只是使用then 来保持管道信息,从不返回它
  • 你的get数据会返回对吗??
  • 我通过这个调用 return getData(pastReport, laterReport) 返回承诺,然后将获取 json 对象,因此您的 json 对象将在 res 中
  • @adamSiwiec 是的,你需要学习如何使用 Promise。在承诺履行之前,您要返回的数据不可用。
  • 是的,我了解@YashGanatra,但是有没有办法让 test 保持这个值而不是 res ?这是我的问题。
【解决方案2】:

test 方法确实返回了一个承诺。要访问数据,请调用 .then() 函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-11-21
    • 2021-07-22
    • 2018-06-24
    • 2020-12-20
    • 2021-01-13
    相关资源
    最近更新 更多