设置对外部变量的承诺

时间:2016-11-17 03:46:19

标签: javascript angularjs

我有一个函数可以返回一个承诺(我相信,我是javascript的新手),我试图将其设置为变量mxY。我写了这样的函数:

function maxYvalue2() {
    return Rpt_scn_cost_v.find({filter: { where: {scenario_id: $stateParams.id}}}).$promise.then(function(response){
        var maxYvalue = 0
        for (var i=0;i<response.length;i++) {
            var currMaxYvalue = parseFloat(response[i].cur_cost) + parseFloat(response[i].tgt_cost);
            if (currMaxYvalue > maxYvalue) {
                maxYvalue = currMaxYvalue
            };
        }
        console.log("yVal: " + maxYvalue)
        return maxYvalue;
    });
};

var mxY = maxYvalue2().then(function (response) {
    console.log("fnc: ", response);
    return response;
});


console.log(mxY);

我的控制台显示了这一点,其中mxY似乎记录了{$$state: Object}

reports.controller.js:99 d {$$state: Object}
    $$state: Object
        status: 1
        value: 78820.3574413
        __proto__: Object
      __proto__: Object
reports.controller.js:88 yVal: 78820.3574413
reports.controller.js:94 fnc:  78820.3574413

根据我的理解到目前为止,.then中的maxYvalue2()正在返回一个承诺,这就是我回到$$state.Object的原因,但我需要做的是&#34;解开&#34;它解决时的承诺是正确的还是我完全离开这里?然后我将它设置为变量?

------ EDIT ---------

我试图将maxYvalue2()的结果转到此处...在下方突出显示的区域中将yDomain: [0, 100000]更改为yDomain: [0, mxY]

function maxYvalue2() {
    return Rpt_scn_cost_v.find({filter: { where: {scenario_id: $stateParams.id}}}).$promise.then(function(response){
        var maxYvalue = 0
        for (var i=0;i<response.length;i++) {
            var currMaxYvalue = parseFloat(response[i].cur_cost) + parseFloat(response[i].tgt_cost);
            if (currMaxYvalue > maxYvalue) {
                maxYvalue = currMaxYvalue
            };
        }
        console.log("yVal: " + maxYvalue)
        return maxYvalue;
    });
};

var mxY = maxYvalue2().then(function (response) {
    console.log("fnc: ", response);
    return response;
});


console.log(mxY);


    $scope.options_scn_cst = {
            chart: {
                type: 'lineChart',
                height: 450,
                margin : {
                    top: 20,
                    right: 20,
                    bottom: 40,
                    left: 55
                },
                x: function(d){ return d.x; },
                y: function(d){ return d.y; },
                useInteractiveGuideline: true,
                dispatch: {
                    stateChange: function(e){ console.log("stateChange"); },
                    changeState: function(e){ console.log("changeState"); },
                    tooltipShow: function(e){ console.log("tooltipShow"); },
                    tooltipHide: function(e){ console.log("tooltipHide"); }
                },
                xAxis: {
                    axisLabel: '',
                    tickFormat: function(d) { return d3.time.format('%b %y')(new Date(d)); }
                },
                yDomain: [0, 100000], //<======change the 100000 to the var mxY
                yAxis: {
                    axisLabel: '$ / month',
                    tickFormat: function(d){
                        return d3.format('$,.0f')(d);
                    },
                    axisLabelDistance: -10
                },
                callback: function(chart){}
            },
            title: {
                enable: true,
                text: 'Scenario Costs Over Time'
            },
            subtitle: {
                enable: false,
                text: 'Put your Subtitle here.',
                css: {
                    'text-align': 'center',
                    'margin': '10px 13px 0px 7px'
                }
            },
            caption: {
                enable: false,
                html: 'Put your Caption Here.',
                css: {
                    'text-align': 'justify',
                    'margin': '10px 13px 0px 7px'
                }
            }
        };

1 个答案:

答案 0 :(得分:1)

一旦你有了承诺,就无法同步打开它。欢迎来到异步编程之地!

如果出现错误,您只能检索then()子句(或catch()子句)内的promise的解析。

当您致电console.log(mxY);时,您正在以创建承诺的相同标记访问承诺本身。承诺尚未解决。由于JavaScript是单线程的,因此除了异步之外,您永远无法访问promise的解析。

所以,是的,您必须使用then()子句。值得庆幸的是,promises提供了一种链接then的机制。

你可以这样做:

maxYvalue2().then(function (response) {
    console.log("fnc: ", response);
    return response;
}).then(function (response) {
    // do something
    return newResponse
}).then(function (newResponse) {
    // do something
    return notherNewResponse
}).then(function (notherNewResponse) {
    // etc
    return notherNotherNewResponse
});

这表明你可以链接你的承诺并使用它们来执行一些相当复杂的异步计算。