javascript - 异步/等待失败的 Angular promise

标签 javascript angular angular-promise ecmascript-5 strict

到目前为止,我所看到的解决问题的建议似乎并不适用,或者我有很大的误解(我已经有一段时间没有接触全栈了)。我有一项服务可以成功访问 Spring Boot 后端以获取进程列表:

function getReportProcesses(){
        var deferred =  $q.defer();
        var url = "fermentationReports/processes";
        httpService.get(url).then(function (data){
            deferred.resolve(data);
        }, function(msg){
            var errMsg  = "failed to get report processes: " +  msg;
            deferred.reject(errMsg);
        });
        return deferred.promise;
    }

我的目标是从下拉列表工厂访问服务,将列表转换为 JSON,然后将其传递给由下拉指令填充的下拉列表。当指令调用以下行获取 JSON 时:

var data = ReportDdlFactory.getReportName();
            addAllTo(data, $scope.addAll);

它不会等待 getReportName() 中的 httpService 返回,然后将 data 添加为 undefined到范围。这是工厂中的原始方法:

function getReportName() {

            try {
                FermentationReportsService.getReportProcesses().then(function (data) {
                    if (data.processes !== undefined) {

                        var output = {"data": []};
                        for (var i = 0; i < data.processes.length; i++) {
                            var currentLine = {"value": data.processes[i], "label": data.processes[i]};
                            output.data.push(currentLine);
                        }
                        return output;

                    } else {
                        return {
                            "data": [
                                {"value": "ERROR OBTAINING PROCESSES", "label": "ERROR OBTAINING PROCESSES"}]
                        };
                    }
                });
            } catch (err) {
                console.log("error caught: " + err);
            }
        }

我试图将其更改为使用 async/await,因为 getReportProcesses() 已经返回了一个 promise:

async getReportName() {

            try {
                await FermentationReportsService.getReportProcesses().then(function (data) {
                    if (data.processes !== undefined) {

                        var output = {"data": []};
                        for (var i = 0; i < data.processes.length; i++) {
                            var currentLine = {"value": data.processes[i], "label": data.processes[i]};
                            output.data.push(currentLine);
                        }
                        return output;

                    } else {
                        return {
                            "data": [
                                {"value": "ERROR OBTAINING PROCESSES", "label": "ERROR OBTAINING PROCESSES"}]
                        };
                    }
                });
            } catch (err) {
                console.log("error caught: " + err);
            }
        }

但我总是从 jshint 得到这个:

 14 |            async getReportName() {
                 ^ Expected an assignment or function call and instead saw an expression.
 14 |            async getReportName() {
                      ^ Missing semicolon.
 14 |            async getReportName() {
                                      ^ Missing semicolon.
 17 |                    await FermentationReportsService.getReportProcesses().then(function (data) {
                         ^ Expected an assignment or function call and instead saw an expression.
 17 |                    await FermentationReportsService.getReportProcesses().then(function (data) {
                              ^ Missing semicolon.
  8 |                getReportName: getReportName,
                                    ^ 'getReportName' is not defined.
 14 |            async getReportName() {
                       ^ 'getReportName' is not defined.
 14 |            async getReportName() {
                 ^ 'async' is not defined.

我觉得我可能让这件事变得比需要的更难,或者我可能遗漏了一些简单的东西?


编辑:

经过更多研究后,我确定该应用程序以 'strict' 运行,强制执行 ECMA 5。是否有一种方法可以在不使用 ES6 方法的情况下继续之前强制响应?

最佳答案

我可能会做这样的事情:

function getReportName() {
  return FermentationReportsService
    .getReportProcesses()
    .then(function(data) {
      if (data.processes === undefined) {
        return { data: [
          { value: "ERROR OBTAINING PROCESSES", label: "ERROR OBTAINING PROCESSES" }
        ]};
      }
      
      return {
        data: data.processes.map(function(process) {
                return { value: process.value, label: process.value };
              })
      };
    })
    .catch(function(err) {
      console.log("error caught: " + err);
    });
}

关于javascript - 异步/等待失败的 Angular promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66925233/

相关文章:

javascript - "this"在 ngOnInit 中变为未定义

javascript - 如何在 angularjs 中测试 .then 的 .notify

javascript - 设置 cookie 1 小时并在加载时检查它

javascript - Angular 4 node_modules

JavaScript for 循环性能 - 在函数内部更好?

mysql - 在 ngFor 循环内使用 ngIf 条件实现类似 Angular 的按钮

angular - 使用实现自己组件的子模块

javascript - 使用 TypeScript 在 AngularJS 中的指令之间共享来自异步调用的数据

javascript - 如何使用 RegEx 和 Jquery 隐藏 DIV 元素

javascript - 如何删除元素数组上的属性?