如何在角度中解析函数并调用其他函数

时间:2016-06-10 08:53:50

标签: javascript angularjs

我有两个函数,我希望在其他函数成功解析之后再调用一个函数。

$scope.createNewWorkModule = function (data, selectedUser) {

        $scope.workOrderInfo = $localStorage.workOrderInfo;

        $scope.createNewWorkOrder($scope.workOrderInfo).then(function (response) {

            $scope.workOrderId = $localStorage.workOrderId;

            var newWM = {
                name: data.name,
            };

            $scope.myPromise = operationsFactory.createWorkModule(angular.toJson(newWM)).success(function (response) {

                $rootScope.workModules = response.result;
                return $scope.workOrder;

            })
        });
    };

    $scope.createNewWorkOrder = function (data) {

        var newWD = {
            name: data.name,
            description: data.description,
            user_id: $cookies.userId
        };

        $scope.myPromise = operationsFactory.createWorkOrder(angular.toJson(newWD)).success(function (response) {

            $localStorage.workOrderId = response.result.id;

        })

        return $localStorage.workOrderId;
    };

我正在尝试使用$scope.createNewWorkOrder来呼叫.then但是它会给出错误

TypeError: Cannot read property 'then' of undefined at Scope.$scope.createNewWorkModule (work-order-create-controller.js:36) at $parseFunctionCall (angular.js:12158)

我该如何解决这个问题?

更新

无法使用检索到的数据更新视图:

<div class="panel panel-default">
    <div class="panel-heading font-bold">
        <span>List of Work Modules</span>
    </div>
    <ul ng-repeat="wm in workModules" style="list-style: none">
        <li>{{wm.name}}</li>
        <li>{{wm.description}}</li>
    </ul>
</div>

2 个答案:

答案 0 :(得分:1)

您收到错误then is not a function,因为返回的值为undefined,因为$localStorage.workOrderId已解析为异步。理想情况下,你应该回复一个承诺。

return operationsFactory.createWorkOrder(angular.toJson(newWD)).success(function (response) {

       $localStorage.workOrderId = response.result.id;
       return $localStorage.workOrderId;

});

答案 1 :(得分:1)

  1. 你的异步函数应该总是返回promises。
  2. 确保then成功函数始终返回链中下一个处理程序所需的值(并且不要使用已弃用的.success方法,因为它不能正确链接,请始终使用{ {1}}但请注意,从.then结果获得的参数略有不同。
  3. 除非你真的需要它们,否则尽量不要把东西放进$http,可能你的很多函数都只是函数,值可能是控制器中的局部变量。

    请注意,一旦使用$scope,您可以在一个成功处理程序结束时发出新调用,并在同一级别处理另一个.then的结果,无需进一步嵌套。

    .then