Как приостановить Javascript MAP, пока Firebase Firestore не завершится? Обещание, Async / Await или оба - PullRequest
0 голосов
/ 28 октября 2019

Мне нужно иметь возможность сопоставлять (или, если нужно, foreach) множество учетных записей. Я хочу проверить, существует ли учетная запись в Firebase Firestore, прежде чем я обновлю ее или добавлю как новую учетную запись. Проблема в том, что карта продолжает работать, а затем наконец запускается функция Firebase Firestore. Я попытался обернуть Firestore своим собственным обещанием, но это не сработало. Мне нужно, чтобы все было в порядке. Я знаю, что мои Promise и / или Async / Await находятся в неправильных местах. Я все еще учусь правильно использовать обещания и async / await.

    let db = admin.firestore();

    (async () => {
        const accountInfo = [{ accountNumber: 'a' }, { accountNumber: 'b' }, { accountNumber: 'c' }];
        for (let i = 0, j = accountInfo.length; i < j; i++) {
            console.log("i: ", i);
            await Promise.all(
                accountInfo
                    .map(account => {

                        const {accountNumber} = account;
                        console.log(accountNumber);

                        // Firebase - Firestore
                        let docRef = db.collection('accounts').doc(accountNumber);

                        docRef.get().then(function (doc) {

                            console.log("doc.exists ", doc.exists)

                            if (doc.exists) {
                               firebaseUpate();
                            }
                            else {
                               firebaseAdd();
                            }
                        })
                    })
            )
        }
    })();

Результаты, которые я получаю:

[0] i:  0
[0] a
[0] b
[0] c
[0] i:  1
[0] a
[0] b
[0] c
[0] i:  2
[0] a
[0] b
[0] c
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false

Необходимые мне результаты: Console.log ()

[0] i:  0
[0] a
[0] doc.exists  false
[0] i:  1
[0] b
[0] doc.exists  false
[0] i:  2
[0] c
[0] doc.exists  false

1 Ответ

2 голосов
/ 28 октября 2019

Удалить Promise.all и просто await для doc в for цикле:

let db = admin.firestore();

(async () => {
  const accountInfo = [
    { accountNumber: "a" },
    { accountNumber: "b" },
    { accountNumber: "c" }
  ];
  for (let i = 0, j = accountInfo.length; i < j; i++) {
      console.log("i: ", i);
      const { accountNumber } = accountInfo[i];
      console.log(accountNumber);

      // Firebase - Firestore
      let docRef = db.collection("accounts").doc(accountNumber);

      const doc = await docRef.get();

      console.log("doc.exists ", doc.exists);

      if (doc.exists) {
        firebaseUpate();
      } else {
        firebaseAdd();
      }
  }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...