push to array in async/await

0

czy ktoś wie dlaczego zwraca pustą tablice?

import { readFile, writeFile, readdir } from "fs/promises";
import { v4 } from "uuid";
import { Document } from "@interface/document.js";

class Store {
  $collection: Document[] = [];

  collection = async (): Promise<any> => {
    let dir = await readdir("docs");

    dir.forEach(async (file) => {
      let document = await this.readDoc(file);
      this.$collection.push(document); // <-- nic nie dodaje!
    });

    return this.$collection;
  };

  readDoc = async (uuid: string): Promise<Document> => {
    let buffer = await readFile(`docs/${uuid}`, "utf-8");
    let data: {} = await JSON.parse(buffer);

    return { uuid, data };
  };

  writeDoc = async (data: {}): Promise<Document> => {
    let uuid: string = v4();

    await writeFile(
      `docs/${uuid}.json`,
      JSON.stringify(data, null, 4),
      "utf-8"
    );

    return { uuid, data };
  };
}

const store = new Store();

console.log(await store.collection()); // returns [] instead of [{"version": "1.0","extension": "json","path": "docs"}]

store.collection().then((collection) => {
  console.assert(collection.length > 0);
});

0

Nie wiem czy bazując na promisach nie powinieneś używać then/catch

1

Prawdopodobnie powinieneś mieć: await dir.forEach().

0
Patryk27 napisał(a):

Prawdopodobnie powinieneś mieć: await dir.forEach.

Operator „await” nie ma wpływu na typ tego wyrażenia.ts(80007)

1
ledi12 napisał(a):

Nie wiem czy bazując na promisach nie powinieneś używać then/catch

znalazłem rozwiązanie

const dir = await readdir("docs");

this.$collection.push(
    ...(await Promise.all(
        dir.map((file) => this.readDoc(file))
    ))
);

return this.$collection;
0

w zasadzie i push nie jest potrzebne w tym przypadku. Bo teraz robisz trochę naokoło - masz już gotową tablicę i zamiast ją przypisać do this.$collection, to robisz ... i push. A mógłbyś pominąć te elementy

this.$collection = (await Promise.all(
  dir.map((file) => this.readDoc(file))
));

chyba, żeby ci zależało na stałości referencji i na dodaniu czegoś do konkretnie tej tablicy.

czy ktoś wie dlaczego zwraca pustą tablice

Zwracało ci pustą tablicę, ponieważ kod odpalał się asynchronicznie (użyłeś await this.readDoc(file), więc kod w środku forEach czekał), a w momencie kiedy się wywołało return this.$collection; jeszcze nie było nic w tablicy, bo niby skąd miałoby tam się znaleźć, skoro sam zawiesiłeś działanie funkcji? To, co masz po await, się wykona później.

1 użytkowników online, w tym zalogowanych: 0, gości: 1