javascript - 如何从异步 API 返回 AngularJS promise

标签 javascript angularjs angular-promise

AngularJS:从函数返回值

我该如何解决这个问题?

   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 中,promises 很容易通过 $q provider 创建这将帮助您使用 defer() 方法创建新的 promise 。 下面是你如何实现它(记得注入(inject) $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));
};

关于javascript - 如何从异步 API 返回 AngularJS promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50376539/

相关文章:

单击任何其他元素时,Javascript 更改 css

javascript - 下载 bootstrap.min.js 在 Django 模板中不起作用

javascript - 基于一个值对一组输入使用 ng-disabled

javascript - 在 $stateChangeStart 触发之前解决抽象父级中的 promise

javascript - 数组上的 .forEach() 与 NodeList (JavaScript)

javascript - 将多次出现的 && 替换为 <b>,将 %% 替换为 <i> 标记

javascript - Angularjs 数组中的嵌套对象数组

javascript - 下拉菜单在桌面模式下不起作用

javascript - 使用 Promise 时无法在 AngularJS 中正确同步流程

javascript - 链接 $resource promise 的 Angular 问题