如何让循环停止并等待,然后再继续?(JavaScript异步/等待Firestore侦听器)

如何让循环停止并等待,然后再继续?(JavaScript异步/等待Firestore侦听器),javascript,async-await,google-cloud-firestore,Javascript,Async Await,Google Cloud Firestore,此函数处理一组字。如果它在我们的字典里找到一个词,它就会继续下一个词。如果它在我们的字典中找不到这个单词,它会向我们的Firestore数据库写入一个单词请求。然后,它设置一个侦听器,侦听要写入Firebase数据库的单词响应。当响应被写入时,侦听器被分离。这大约需要两秒钟。此代码在不等待单词响应的情况下遍历单词数组。我如何告诉它在进入下一个单词之前等待单词响应 $scope.requestWords=function(){ 异步函数processWordRequests(){ for(让$sc

此函数处理一组字。如果它在我们的字典里找到一个词,它就会继续下一个词。如果它在我们的字典中找不到这个单词,它会向我们的Firestore数据库写入一个单词请求。然后,它设置一个侦听器,侦听要写入Firebase数据库的单词响应。当响应被写入时,侦听器被分离。这大约需要两秒钟。此代码在不等待单词响应的情况下遍历单词数组。我如何告诉它在进入下一个单词之前等待单词响应

$scope.requestWords=function(){
异步函数processWordRequests(){
for(让$scope.wordsArray的单词){
console.log(word);
var doc=await firebase.firestore().collection('Dictionaries').doc($scope.longLanguage).collection(“Words”).doc(word).get()
如果(文档数据()==未定义){
log(“在二语词典中找不到“+word+”);
等待firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_请求').set({
字:字,
requestOrigin:$scope.longLanguage+':'+$scope.movieTitle+':'+$scope.clipInMovieModel
})
console.log(“请求的”+字);
等待firebase.firestore().collection('Users').doc($scope.user.uid)。collection($scope.longluage)。doc('Word_Response')。onSnapshot(函数(doc){
log(“侦听响应…”);
if(doc.data().word==word){
log(word+“添加到二语词典中”);
firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word\u Response'))
.onSnapshot(函数(){
log(“侦听器已取消订阅”)
//我如何让它在这里等待,然后再继续下一个单词?
回来
});
}
否则{
log(“仍在侦听…”)
}
});
}否则{
log(“在二语词典中找到“+word+”);
}
}
}
processWordRequests();
};

您需要使用承诺或承诺您的代码

您有以下代码行:

    await firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Response').onSnapshot(function(doc) {
右边哪条路(请使用换行符以提高可读性)有
.onSnapshot(函数(doc){
,我不确定,但我猜它不会返回承诺,所以您不能等待

相反,你可以用这样的承诺来包装它

await new Promise((resolve, reject)=> {
    firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Response').onSnapshot(function(doc) {
    ...
    resolve("value-to-return-to-await").
    ...
});

您可以通过这个自包含的培训课程了解更多关于承诺的信息:

为什么要使用
onSnapshot
而不是像其他地方一样简单地等待它呢?onSnapshot是Firebase侦听器。当数据写入数据库中的某个位置时,它会触发。我正在进行异步API调用,然后等待响应k并写入数据库(从云函数),然后循环再次迭代。好吧,也许我只是感到困惑,因为您使用了
firebase.firestore().collection('Users').doc($scope.user.uid)。collection($scope.longluage)。doc('Word_Response')。onSnapshot(函数(doc){
两次,一次是用
等待
,另一次是你第一次问关于……的问题,效果非常好!