Javascript 在这种情况下,如何返还承诺?

Javascript 在这种情况下,如何返还承诺?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我不熟悉Firebase的JavaScript,我知道我可以用检索到的数据的输出返回一个承诺。但在以下情况下,我真的看不透: filterUsersAndCalculateMatches = (userProfile, userID, potentialMatches, maxDistanceToSearchForMatches) => { const TOTAL_SCORE = 100; var matches = {}; // Matches to be stored in

我不熟悉Firebase的JavaScript,我知道我可以用检索到的数据的输出返回一个承诺。但在以下情况下,我真的看不透:

filterUsersAndCalculateMatches = (userProfile, userID, potentialMatches, maxDistanceToSearchForMatches) => {
   const TOTAL_SCORE = 100;
   var matches = {}; // Matches to be stored in the database
   potentialMatches.forEach(user => {
     if (user.val() !== userID) {

           databaseRef.child(`users/${user.val()}/profile`).once("value", (snapshot) => {
             const matchScore = calculateMatchScore(userProfile, snapshot.val(), maxDistanceToSearchForMatches);
             //console.log("final score is " + matchScore);
             if (matchScore) {
               const match = {
                   compatibility: matchScore / TOTAL_SCORE,
                   distance: distance,
                   profile: snapshot.val()
               }
               matches[user.val()] = match;
             }
           });
     }
   });
 };
我正在迭代用户的ID并访问他们的配置文件以进行一些计算,并将结果连同他们的配置文件一起添加到对象中

如何在所有用户都通过后返回matches对象的承诺

返回一个承诺。 你可以用。all获取一个承诺数组作为参数,并返回一个承诺,当所有传递的承诺都解决时,它将解决该承诺。 修改后的代码如下所示:

FilterUsers和CalculateMatches=用户配置文件、用户ID、潜在匹配项、maxDistanceToSearchForMatches=>{ var matches={};//要存储在数据库中的匹配项 const promisesList=[]; potentialMatches.forEachuser=>{ 如果user.val!==userID{ //保存对承诺的引用 const dataPromise=databaseRef.child`users/${user.val}/profile`。oncevalue,snapshot=>{ // ... }; //将承诺推送到承诺列表中 promiseList.pushdataPromise; } }; return Promise.allpromisesList.then=>Promise.resolvematches; }; 即使列表中的某个承诺被拒绝,您也可能希望解决此问题。 您可以执行以下操作,处理拒绝的承诺

承诺人 //我们必须处理拒绝 数据承诺 .thendata=>data //返回带有{error}对象的已解析承诺。 //履行这一承诺。即使其中一些承诺被拒绝,所有承诺都将得到解决。 .catcherror=>{ 返回{error:error}; } ;
您可以创建一个promise,当对概要文件进行迭代时,它将与matches对象进行解析。注意我没有处理错误

FilterUsers和CalculateMatches=用户配置文件、用户ID、潜在匹配项、maxDistanceToSearchForMatches=>{ //回报新的承诺 返回新的PromiseSolve,拒绝=>{ 常数总分=100; var matches={};//要存储在数据库中的匹配项 var promissions=[];//在对概要文件进行迭代期间为承诺创建一个数组 potentialMatches.forEachuser=>{ 如果user.val!==userID{ //var p中的储蓄承诺 var p=databaseRef.child`users/${user.val}/profile`.oncevalue.thensapshot=>{ const matchScore=calculateMatchScoreuserProfile,snapshot.val,maxDistanceToSearchForMatches; //console.logfinal分数为+匹配分数; 如果匹配分数{ 常数匹配={ 兼容性:匹配分数/总分数, 距离:距离,, 配置文件:snapshot.val } matches[user.val]=匹配; } }; promises.pushp; } }; Promise.allpromises.thenresolve.bindresolve,匹配; };
};你能提供更多的背景来说明你正在努力实现的目标和你已经尝试过的目标吗?谢谢你的回答。我试过了,当我记录返回的承诺时,我得到了一个待定的承诺。。。如何提取匹配项?可以为无法解析的承诺添加句柄。只有所有的承诺都解决了,所有的承诺才会解决。我会更新答案。谢谢你的回答。我试过了,当我记录返回的承诺时,我得到了一个待定的承诺。。。如何提取匹配项?如果您立即记录返回的承诺,它将挂起,因为异步函数没有执行完毕。要获得匹配项,必须通过then函数获取它。然后在异步操作完成时执行该函数。例如:`filterUsersAndCalculateMatchesarg1,arg2。thenmatches=>{console.logmatches}`就是这样。。。非常感谢你的帮助。我必须给bogdanpetru一个正确的答案,尽管他是第一个回答的人,但是我对你的评论给予了评价。再次感谢,当然!一切都很好。当我开始回答时,我必须查找Firebase API以确保我给出了正确的答案。我没有使用Firebase的经验。如果我看到bogdanpetru的答案,我不会发布我的答案,因为它们在语义上是相同的。很高兴你找到了解决办法。