Javascript 异步/等待失败的角度承诺

Javascript 异步/等待失败的角度承诺,javascript,angular,angular-promise,ecmascript-5,strict,Javascript,Angular,Angular Promise,Ecmascript 5,Strict,到目前为止,我所看到的解决我的问题的建议似乎不适用,或者我有一个很大的误解(我已经有一段时间没有触及全部内容了)。我有一个服务,它成功地访问了Spring引导后端以获取进程列表: function getReportProcesses(){ var deferred = $q.defer(); var url = "fermentationReports/processes"; httpService.get(url).the

到目前为止,我所看到的解决我的问题的建议似乎不适用,或者我有一个很大的误解(我已经有一段时间没有触及全部内容了)。我有一个服务,它成功地访问了Spring引导后端以获取进程列表:

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,并将其传递给由dropdown指令填充的下拉列表。当指令调用以下行以获取JSON时:

var data = ReportDdlFactory.getReportName();
            addAllTo(data, $scope.addAll);
它不会等待
getReportName()
中的
httpService
返回,然后将
数据作为
未定义的
添加到范围中。这是工厂的原始方法:

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);
            }
        }
但我总是从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.
我觉得我可能让事情变得更难,或者我错过了一些简单的事情


编辑:


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

通过使用async/await,您不再需要使用然后

异步函数getReportName(){ 试一试{ 常量数据=等待发酵报告服务。getReportProcesses(); if(data.processs!==未定义){ 变量输出={data:[]}; 对于(var i=0;i

查看本文了解更多信息我可能会这样做:

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);
    });
}

在使
异步时,仍然需要
函数
关键字。也就是说,在这两种情况下,您的问题都是不返回任何值。您需要
返回发酵报告服务.getR…
。“承诺”将解析为该值此代码对我来说不清楚,因此如果有可能通过@blex共享完整版本,谢谢,我将对此进行测试。@malbarmavi抱歉,我不能。大部分代码都是我所在公司的专有和机密代码。我甚至不得不混淆函数名等来安全地将我的问题发布到这里。@blex当你对
return-ferenceationreportsService.getR…
,我不能这样做。它是一个列表,所以我需要迭代它们并返回我创建的JSON对象,该对象发生在for循环之后。返回
输出
变量是否会使进程无效?谢谢,我看到我的jshint仍在抱怨。首先,它在函数头中这样说async:
期望一个赋值或函数调用,而看到一个表达式。未定义后跟
async
。以及ES6中提供的
“const”。
async
是否需要在模块工厂标题中定义或包含某些内容?它还需要在
const data=await-meeticationreportsService.getreportprocesss()行的
await
后面加一个分号getReportName是类的一部分吗?如果是这样,您需要删除function关键字,但我不确定,因为如果您正在使用angular,您不会共享组件的完整源代码。谢谢大家迄今为止的帮助。我做了更多的挖掘,并确定这是“严格的”,使用ES5,因此这些方法在我的位置上显然是不允许的。你知道一种使用ES5的方法吗?显然,arrow、await、async等是不允许的,jshint也不承认它们是合法的关键字。谢谢blex。我做了更多的挖掘,并确定这是“严格的”,使用ES5,因此这些方法在我的位置上显然是不允许的。你知道一种只使用ES5关键字的方法吗?显然,arrow、await、async等是不允许的,jshint也不能将它们识别为合法关键字。@DarrelHolt我已经编辑了答案,这应该可以正常工作。应用程序正确构建并传递jshint,但它仍然会在执行
getReportName()
之前命中将
数据添加到作用域的指令行。
数据
对象也具有以下结构:
{“$$state”:{“status”:0}
。我是否应该使指令中对
getReportName()
的调用方法异步,以便它也等待?哦,是的,我忘记了这一部分。此函数返回一个承诺,因此它是异步的。您需要执行以下操作:
ReportDdlFactory.getReportName().then(函数(数据){addAllTo(数据,$scope.addAll);})谢谢,你知道了。还有一些方法使用指令中的
数据
变量,因此我将这些方法放在
然后
方法中,效果非常好。
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);
    });
}