【问题标题】:resolve after new Promise did nothing (console.log -> undefined)在 new Promise 什么也没做之后解决(console.log -> undefined)
【发布时间】:2020-12-12 20:32:13
【问题描述】:

这是我的 Promise 函数,我遍历 Azure BlobStorage 中的每个 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


    })
  }

然后在组件文件中,我想从解析中检索数据,它应该返回 JSON 字符串变量,如“name”、“timestamp”、“value”——但在我的例子中,您从 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)

  }

  

}

编辑: 即使我在 main 函数中return download,从 main() 解析也不会传递 json 字符串。

第二次编辑: 这里是 sn-ps 如何返回数据:

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
        }

      }

但是我没有收到下载的文件,错误还是一样。 如果你能帮助我,那就太好了

【问题讨论】:

  • 你用main()的返回值来解决它……它有no return声明!
  • @Quentin 哦,我要返回的变量是“下载”,但如果我返回下载没有任何更改,请参见上面的代码

标签: javascript angular typescript


【解决方案1】:

您不会从main 返回任何内容。只需返回答案即可。

【讨论】:

  • 你的意思是像这样的异步函数 main() { --code-- } return download 吗?因为在下载变量中我存储了 json 字符串
  • 您在 main 中有 for 循环,因此它可能是多个值。但是在那里的某个地方你应该有 return 声明。
  • 对,谢谢@Konrad,你是对的!我添加了一个返回语句并声明了一个数组
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多