私はこの問題が発生したのは初めてではありませんが、私はいつも解決策を見つけることができました。これはうまくいきますが、改善する方法を理解したかったのです。だから、私の例では、私はコースのリストを持っている、と私はそれらのそれぞれの平均採点を計算する必要があります。JavaScript約束事がすでに使用されている場合、JavaScriptの非同期性を克服するにはどうすればよいですか?
今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;
};
、何が起こりますかアプリケーションが実際にサーバーからuserCoursesのリストをダウンロードする前に、courses.forEachが呼び出され、関数は常に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;
});
};
私はこれが、この問題について移動する最良の方法はないと考えています。最初の例では、それにはの返信文を使用することはできません。また、約束を約束することはできません。あなたが私の場所にいるなら、この問題をどうやって解決しますか?
"私は約束を約束することはできません" ...?さて、あなたは*できました。しかし、あなたは本当にあなたがすでに持っている約束を「返す」必要があります。 – deceze
あなたが思いついた "回避策"は実際に(正しい)方法であると思います。最もエレガントではないが、正しい。 –
同じ問題です、私はもっときれいなコード結果を得たい –