ループのこれを停止して待機してから続行するにはどうすればよいですか?(JavaScript async / await with Firestoreリスナー)

トーマス・デビッド・ケホー

この関数は、単語の配列を処理します。辞書で単語が見つかると、次の単語に進みます。辞書に単語が見つからない場合は、Firestoreデータベースに単語リクエストを書き込みます。次に、Firebaseデータベースに書き込まれる単語の応答をリッスンするリスナーを設定します。応答が書き込まれると、リスナーは切り離されます。これには約2秒かかります。このコードは、単語の応答を待たずに単語の配列を反復処理します。次の単語に進む前に単語の応答を待つように指示するにはどうすればよいですか?

$scope.requestWords = function() {

  async function processWordRequests() {
    for (let word of $scope.wordsArray) {
      console.log(word);
      var doc = await firebase.firestore().collection('Dictionaries').doc($scope.longLanguage).collection("Words").doc(word).get()
      if (doc.data() === undefined) {
        console.log("Didn't find " + word + " in L2 dictionary.");

        await firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Request').set({
          word: word,
          requestOrigin: $scope.longLanguage + ':' + $scope.movieTitle + ':' + $scope.clipInMovieModel
        })
        console.log("Requested " + word);

        await firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Response').onSnapshot(function(doc) {
          console.log("Listening for response...");
          if (doc.data().word === word) {
            console.log(word + " added to L2 dictionary.");
            firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Response')
            .onSnapshot(function (){
              console.log("Listener unsubscribed.")
              // How do I make it wait here before going on to the next word?
              return;
            });
          }
          else {
            console.log("Still listening...")
          }
        });

      } else {
        console.log("Found " + word + " in L2 dictionary.");
      }
    }
  }

  processWordRequests();
};
シークレット

約束を使用するか、コードを約束する必要があります。

次のコード行があります。

    await firebase.firestore().collection('Users').doc($scope.user.uid).collection($scope.longLanguage).doc('Word_Response').onSnapshot(function(doc) {

どちらが右側にあるか(読みやすさを向上させるために改行を使用してください).onSnapshot(function(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").
    ...
});

この自己完結型のトレーニングコースで約束について詳しく知ることができます:https//github.com/stevekane/promise-it-wont-hurt

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ