如何 return AngularJS 从异步中承诺 API

How to return AngularJS promise from asynchronous API

AngularJS:Return 来自函数的值

我该如何解决这个问题?

   function byDepartment () {
            var result = null;
            deparmentService.query({
                codDepartment: vm.codDepartment.codDepartment,
                reportBycodDepartment: 1
            }, function (data) {
                var success = JSON.stringify(data.success);
                if (success === false) {
                    console.log(JSON.stringify(data.data));
                    result = data.message;
                } else {
                    result = data.data;
                    console.log('Always has a value: ' + result);
                }
            });
            console.log('Always null: ' + result);
            return result;
        }

Chrome 的控制台回答这个问题: 始终为空:空 总是有一个值:[object Object],[object Object]

我想在之后的下一个函数中使用这个值:

  vm.updateChart = function () {
            vm.testValue = 0;
            if (!vm.codTestRoom) {
                console.log('consulta con departamento');
                vm.testValue = byDepartment();
            } else if (!vm.codEquipment) {
                console.log('Consulta con departamento y testRoom');
                vm.testValue = byDepartmentAndTestRoom();
            } else {
                console.log('Consulta con departamento, testRoom y Equipo');
                vm.testValue = byDepartmentAndTestRoomAndEquipment();
            }
            // console.log('Valor: ' + JSON.stringify(vm.testValue));
        };

在 vm.testValue 之后,我将用 chart.js 绘制图表..

谢谢。

发生这种情况是因为您正在进行异步调用,但处理它时却像处理同步一样。 在 angularjs 中,与在常规 javascript 中一样,等待异步调用的一种解决方案是使用 promises

在 angularjs 中,$q provider 可以轻松创建承诺,这将帮助您使用 defer() 方法创建新的承诺。 下面是你如何实现它(记得注入 $q)

function byDepartment () {
    var deferred = $q.defer();
    var result = null;
    deparmentService.query({
        codDepartment: vm.codDepartment.codDepartment,
        reportBycodDepartment: 1
    }, function (data) {
        var success = JSON.stringify(data.success);
        if (success === false) {
            deferred.reject(data.message);
        } else {
            deferred.resolve(result.data);
        }
    });
    return deferred.promise;
}

当调用 byDepartment() 方法时,您需要通过将一个成功函数和一个错误函数传递给 promise 上的 then() 方法来告诉返回的 promise 成功时和不成功时应该发生什么

vm.updateChart = function () {
    vm.testValue = 0;
    if (!vm.codTestRoom) {
        console.log('consulta con departamento');
        byDepartment()
        .then(
            function (result) {
                vm.testValue = result;
            },
            function (message) {
                console.log(error);
            }
        );
    } else if (!vm.codEquipment) {
        console.log('Consulta con departamento y testRoom');
        vm.testValue = byDepartmentAndTestRoom();
    } else {
        console.log('Consulta con departamento, testRoom y Equipo');
        vm.testValue = byDepartmentAndTestRoomAndEquipment();
    }
    // console.log('Valor: ' + JSON.stringify(vm.testValue));
};