risolvere dopo che la nuova promessa non ha fatto nulla (console.log -> undefined)

Aug 24 2020

ecco la mia funzione Promise, esamino ogni BLOB in Azure BlobStorage, quindi leggo ogni BLOB. console.log (download) fornisce i valori come JSON.

Ma per chiudere la nuova funzione Promise di ritorno, voglio che la risoluzione restituisca i dati JSON dalla lettura del blobstream. Ma qui nel mio caso, la determinazione non porta a nulla.

Nel file Angular Service.ts il codice ha questo aspetto:

getData(): Promise<JsonData[]> {

    return new Promise(async resolve => {

      const containerName = "blobcontainer";
      const containerClient = this.blobServiceClient.getContainerClient(containerName);

      //list blobs
      let i = 1;

      async function main() {
        i = 1;
        for await (const blob of containerClient.listBlobsFlat()) {

          console.log(`Blob ${i++}: ${blob.name}`);
          const blockBlobClient = containerClient.getBlockBlobClient(blob.name);
          //console.log(blockBlobClient)
          const downloadBlockBlobResponse = await blockBlobClient.download(0);
          const download = await blobToString(await downloadBlockBlobResponse.blobBody)
          //console.log(downloadBlockBlobResponse)
          console.log(download)

        }

      }

      async function blobToString(blob: Blob): Promise<string> {
        const fileReader = new FileReader();
        return new Promise((resolve, reject) => {
          fileReader.onloadend = (ev: any) => {
            JSON.parse(ev.target!.result)
            resolve(JSON.parse(ev.target!.result));
          };
          fileReader.onerror = reject;
          fileReader.readAsText(blob);
        });
      }
      const _blob = await main().catch((err) => {
        console.error('message'); return null
      });

      resolve(_blob)  //resolve should return downloaded JSON file, but it didn't


    })
  }

Quindi nel file del componente, voglio recuperare i dati dalla risoluzione, che dovrebbe restituire le variabili di stringa JSON come "nome", "timestamp", "valore" - Ma nel mio caso, ricevi i metadati dal blob e non dal Contenuti. Significa che il file service.ts non è programmato correttamente:

xy.component.ts

export class xyComponent implements OnInit {
  @Input() title: string;
  //jsondatas: Array<JsonData> = [];
  jsondata: JsonData;
  name: String;
  timestamp: string;
  value: number;


  //constructor() { }

  private jsonlistService: JsonDataService;
  jsondatas: JsonData[]=null;

  constructor(private jsonService: JsonDataService) {
    this.jsonlistService = jsonService;
  }

  ngOnInit(): void {

    this.jsonlistService.getData()
      .then(results => this.jsondatas = results);

      console.log(this.jsonService)

  }

  

}

EDIT: anche se sono return downloadnella funzione main, la risoluzione da main () non fornisce la stringa json.

Seconda MODIFICA: ecco gli snippet su come restituire i dati:

async function main() {
        i = 1;
        for await (const blob of containerClient.listBlobsFlat()) {

          console.log(`Blob ${i++}: ${blob.name}`);
          const blockBlobClient = containerClient.getBlockBlobClient(blob.name);
          //console.log(blockBlobClient)
          const downloadBlockBlobResponse = await blockBlobClient.download(0);
          const download = await blobToString(await downloadBlockBlobResponse.blobBody)
          
          //console.log(downloadBlockBlobResponse)
          console.log(download)
          return download
        }

      }

Ma non ho ricevuto il file scaricato, l'errore è sempre lo stesso. Sarebbe molto carino se tu potessi aiutarmi

Risposte

KonradLinkowski Aug 24 2020 at 18:32

Non restituisci nulla da main. Restituisci la risposta.