新しいPromiseが何もしなかった後に解決します(console.log-> undefined)

Aug 24 2020

これが私のPromise関数です。AzureBlobStorageの各blobを調べてから、各blobを読み取ります。console.log(download)は、値をJSONとして提供します。

しかし、return new Promise関数を閉じるには、resolveがblobstreamの読み取りからJSONデータを返す必要があります。しかし、ここで私の場合、解決は何にもつながりません。

Angular Service.tsファイルでは、コードは次のようになります。

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


    })
  }

次に、コンポーネントファイルで、リゾルブからデータを取得します。これにより、「name」、「timestamp」、「value」などのJSON文字列変数が返されます。ただし、私の場合は、blobからメタデータを受け取ります。内容。service.tsファイルが正しくプログラムされていないことを意味します。

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)

  }

  

}

編集:私return downloadがmain関数にいる場合でも、main()からのresolveはjson文字列を配信しません。

2番目の編集:データを返す方法のスニペットは次のとおりです。

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
        }

      }

しかし、ダウンロードしたファイルを受け取りませんでした。エラーは同じです。あなたが私を助けることができれば非常にいいでしょう

回答

KonradLinkowski Aug 24 2020 at 18:32

から何も返しませんmain。答えを返すだけです。