【发布时间】:2021-06-29 16:11:36
【问题描述】:
到目前为止,我所看到的解决我问题的建议似乎并不适用,或者我有一个很大的误解(我已经有一段时间没有接触过完整的堆栈了)。我有一项服务成功地访问了 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);
在将data 作为undefined 添加到范围之前,它不会等待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);
}
}
我尝试将其更改为使用 async/await,因为 getReportProcesses() 已经返回了一个承诺:
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 方法的情况下强制响应?
【问题讨论】:
-
在创建
async时,您仍然需要function关键字。话虽如此,您在这两种情况下的问题只是您没有返回任何值。你需要return FermentationReportsService.getR...。然后,Promise 将解析为该值 -
这段代码对我来说不清楚,所以如果可能的话,可以分享一个完整的版本超过stackblitz.com????????
-
@blex 谢谢,我会测试一下。
-
@malbarmavi 对不起,我不能。大多数代码是我工作的公司所拥有的专有和机密代码。我什至不得不混淆函数名称等才能安全地在这里发布我的问题。
-
@blex 当你对
return FermentationReportsService.getR...说时,我做不到。它以列表的形式出现,因此我需要遍历它们并返回我创建的 JSON 对象,该对象发生在 for 循环之后。返回output变量是否会使进程无效?
标签: javascript angular angular-promise ecmascript-5 strict