JavaScript 如果已经使用了 promise,我该如何克服 JavaScript 的异步性?

标签 javascript angularjs asynchronous promise angular-promise

这不是我第一次遇到这个问题,但我总能找到解决方法,我想这很好,但现在我想了解如何改进。因此,在我的示例中,我有一个类(class)列表,我需要计算每个类(class)的平均评分:

var vm = this;

course.averageRating = vm.getAverageRating(course.id);

现在,什么不起作用:

vm.getAverageRating = function (courseId) {
       let sum = 0, courses = [];
       courseContext.getUserCourseFeedback(courseId).then(function(results){
            courses = results;
        });

       courses.forEach(function (course) {
            if(course && course.feedback_rating) {
                sum += course.feedback_rating;
            }
       });
       return courses.length > 0 ? sum / courses.length : null;
};

显然,courses.forEach 在应用程序实际从服务器下载 userCourses 列表之前触发,并且该函数始终返回 null

我的解决方法如下:

vm.averageRatings = {};

vm.getAverageRating = function (courseId) {
  let sum = 0, courses = [];
  courseContext.getUserCourseFeedback(courseId).then(function(results){
       courses = results;

       courses.forEach(function (course) {
            if(course && course.feedback_rating) {
                sum += course.feedback_rating;
            }
       });

       vm.averageRatings[courseId] = courses.length > 0 ? sum/courses.length : null;
  });
};

我认为这不是解决此问题的最佳方法。在我的第一个示例中,我不能在 then 中使用 return 语句,我也不能在 promise 上使用 promise。如果你处在我的位置,你会如何解决这个问题?

最佳答案

使用 promise 没问题,但你应该

  • 返回值的 promise ,而不是写入一些预先确定的对象
  • 简化您的代码,特别是变量声明

function getAverageRating(courseId) {
  return courseContext.getUserCourseFeedback(courseId).then(function(courses) {
//^^^^^^                                                ^^^^^^^
    let sum = 0;
    for (const course of courses)
      sum += course && course.feedback_rating || 0;
    return courses.length > 0 ? sum/courses.length : null;
  });
};

getAverageRating(course.id).then(avg => {
  course.averageRating = avg;
});

关于JavaScript 如果已经使用了 promise,我该如何克服 JavaScript 的异步性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920439/

相关文章:

javascript - 等待 AJAX 请求响应

javascript - 如何在 zebra 日期选择器上调用我的 onchange 事件?

javascript - angularjs 从 $scope 之外访问 ng-model

javascript - 在 Angularjs 指令中将 CSS 样式与模板分开

ios - 更新 block 内的 UI

javascript - 如何在 Javascript 中将 srcElement 转换为字符串

javascript - 将单引号放在字符串javascript中

angularjs - ng-show/-hide 的替代方案或如何仅加载 DOM 的相关部分

azure - 对 Azure 表存储的异步调用

javascript - 类似 promise 的对象,然后可以在 javascript promise 中输入鸭子