为对象方法分配promise的值

时间:2016-01-14 13:46:44

标签: javascript angularjs object methods promise

考虑我正在创建的这个对象。

$scope.formules = {};
$scope.formules = {

    label: 'some label',
    getYear: function() {

        // getData() is a promise
        $scope.getData().then(function(){

            // Some code to get the right data

            return someData;

        }.catch(function () {
         $scope.error = 'bad error';

    }

}();
}

此时,getYear未定义,显而易见,因为我必须做第二次返回。

$scope.formules = {};
$scope.formules = {

    label: 'some label',
    getYear: function() {

        // getData() is a promise
        $scope.getData().then(function(){

            // Some code to get the right data

            return someData;

        }.catch(function () {
         $scope.error = 'bad error';

    }

    return $scope.getData();  //Putting the second return here

}();

或更短的方式可能是这样的:

$scope.formules = {

    label: 'some label',
    getYear: function() {

        // getData() is a promise
        return $scope.getData().then(function(){ // Or putting the second return here.

            // Some code to get the right data

            return someData;

        }.catch(function () {
         $scope.error = 'bad error';

    }


}();

再次这不是正确的方法,因为第二个返回只返回了promise,所以我的方法getYear现在包含一个promise,而不是正确的方法。

上次尝试:

$scope.formules = {

    label: 'some label',
    getYear: function() {

        // getData() is a promise
        return $scope.getData().then(function(){ // return the $scope.getData()

            // Some code to get the right data

            return someData;

        }.catch(function () {
         $scope.error = 'bad error';

    }


}().then(function(data){ return data; });

现在我没有运气和想法,console.log($scope.formules)再次告诉我,getYear是一个承诺,并不会给我价值。

注意:如果我执行console.log(data)而不是return data;,我确实得到了我想要绑定到该方法的值。

我在这里做错了什么,绑定价值的正确方法是什么?堆栈&谷歌没有给我任何答案......

修改

以下是我在方法中使用的实际代码:

getYear: function ()  {

    $scope.measure = value.formules_total_year;

    $scope.getCube().then(function(test){

        var totalRatioData = [];

        for (var i = 0; i < $scope.tempData.length; i++){

        totalRatioData.push($scope.tempData[i][1].qNum);

    }

    return totalRatioData;

})


}(),

$ scope.tempData是一个包含5个数组的数组。 [Array[2], Array[2], Array[2], Array[2], Array[2]],在这5个数组中,您有2个对象

0: Object
    qElemNumber: 0
    qNum: 2009
    qState: "O"
    qText: "2009"
    __proto__: Object
1: Object
    qElemNumber: 0
    qNum: 225632.21000000002
    qState: "L"
    qText: "225632,21"

我想要的是你在这个编辑中看到的是5个数组的最后一个对象的所有qNum的新数组,并将此数组赋值给getYear。

2 个答案:

答案 0 :(得分:0)

有点难以理解你最终想要达到的目标以及你为什么要“绑定”你的getYear()函数中的所有$ scope赋值。在我看来,就像你试图同步返回异步值(totalRatioData)一样。这里的要点是,es5不可能实现这一点。 es7将提供一种名为“await”的新方法,以实现这一目标。

如果要在视图中使用getYear的值,只需将promise的值传递给视图模型($ scope变量)。

// init ctrl
$scope.year = null;
_initYears();
    
function _initYears() {
  
  $scope
    .getData()
    .then(
      function() {
        
        var totalRatioData = [];

        for (var i = 0; i < $scope.tempData.length; i++){

          totalRatioData.push($scope.tempData[i][1].qNum);

        }
        
        // assign data to year
        $scope.year = totalRatioData;
        
      }  
    )
  ;
}

如果您正在使用ui-router,我建议您将您的承诺放在州状态配置的所需部分,以确保在状态激活之前解决。

希望有所帮助

答案 1 :(得分:0)

您不应该在范围属性中调用数据,而应该在控制器中调用数据。

<span ng-bind="formules.label"></span>
<span ng-bind="formules.year"></span>

然后绑定到范围属性

json_decode('["foo","bar"]', true)