将函数转换为角度承诺,因此$ scope。*未定义

时间:2016-01-14 08:46:03

标签: angularjs asynchronous angular-promise

试图缩小我的代码,以便您明白我想要完成但不会成功。

我想要完成的是当我console.log($scope.tempData);时,我看到数据而不是未定义,所以我可以在控制器中使用它。我已经知道承诺是要走的路,因为我在stackoverflow上询问了这个问题:$Scope variable is undefined

但我不知道的是我如何从$scope.getCube();获得承诺,所以我可以$scope.getCube().then(function (data) { ... });我找到了这个:how to create asynchronous function但答案并不明确对我来说够多的了。

/////////// Side Question ////////////

我在底部提供的代码是我在Github上找到的代码,并不是代码的所有内容对我来说都很清楚:为什么ClientService.dynamic()是一个承诺? q.defer中没有this.dynamic = function (params)

////////////////////////////////////////////// < / p>

更好地阅读代码: JSFiddle

// CONTROLLER

$scope.buildObject = function () {

        $scope.getCube(); // 

        console.log($scope.tempData); //gives undefined, obvious because getCube is not done running yet.

    }

    $scope.getCube = function () {

        promise = ClientService.dynamic(params);

        promise.then(function (data) {

            $scope.tempData = data[0];

            return $scope.tempData;

        }

    }

/////////////////////////////////////////////////////

// DYNAMIC SERVICE

this.dynamic = function (params) {

    return qvCommService.send(createHyperCube).then(function (data) {

    }

}

//////////////////////////////////////////////////

// SEND SERVICE

send: function (msg) { 

    var deferred = $q.defer();
    var promise = deferred.promise;

    this.socket = new WebSocket(ws://*************);

    this.socket.addEventListener('open', function (e) {
        deferred.resolve("connected")

    });

    this.socket.send(angular.toJson(msg))

    return promise;
}

1 个答案:

答案 0 :(得分:1)

基本上你错过了从getCube函数返回承诺,因为它应该返回,&amp;在调用getCube函数后,你需要使用.then函数。这样您就可以在.then

的成功回调中获得异步评估值

<强>代码

$scope.getCube = function () {
    promise = ClientService.dynamic(params);
    promise.then(function (data) {
        $scope.tempData = data[0];
        return $scope.tempData;
    }
    return promise; //return promise object
};

$scope.buildObject = function () {
    $scope.getCube().then(function(){
        console.log($scope.tempData);
    })
}