【问题标题】:Fetching data from BlobStorage via Service.ts and call the function NgOnit通过 Service.ts 从 Blob 存储中获取数据并调用函数 NgOninit
【发布时间】:2020-08-24 02:04:58
【问题描述】:

在 service.ts 模块中,我从 Azure Blobstorage 检索数据并想要读取内容。

service.ts

import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { JsonData } from '../models/jsondata';



import {
  BlobServiceClient,
  BlobDownloadResponseModel
} from "@azure/storage-blob";




@Injectable({
  providedIn: 'root'
})

export class JsonDataService {
  private account = environment.ACCOUNT_NAME;

  private sas = environment.SAS;
  private blobServiceClient

  constructor() { this.blobServiceClient = new BlobServiceClient(`https://${this.account}.blob.core.windows.net${this.sas}`) }


  getData(): Promise<JsonData[]> {

    return new Promise(resolve => {


      const containerName = "output2";
      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("Downloaded blob content",download);
          console.log(download)
          return download

        }

      }

      //BROWSER ONLY A HELPER METHOD USED TO CONVERT A BROWSER BLOB INTO STRING
      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(ev.target!.result);
            
          };
          fileReader.onerror = reject;


          fileReader.readAsText(blob);


        });
      }

      main().catch((err) => {
        console.error("Error running sample:", err.message);
      })

    })

  }

}

我用 console.log 测试这个函数,它返回正确的数据。

现在我想通过 test.component.ts 组件访问这个函数,我使用 ngOnit 调用这个函数,但不知何故它只返回元数据,而不是通过调用 getData() 函数返回值。

test.component.ts

import { Component, OnInit, Input } from '@angular/core';
import { JsonDataService } from 'src/app/services/json-data.service';
import { JsonData } from 'src/app/models/jsondata';



@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.scss'],
  providers: [JsonDataService]
})



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

  //constructor() { }

  

  constructor(private jsonService: JsonDataService) {
  
  }

  ngOnInit(): void {
    this.jsonService.getData()
      .then(results => this.jsondatas = results);

    console.log(this.jsonService)

  }

}

这是 NgOnit 的结果: console.log(this.jsonService

但我所期望的是定义的 jsondata 就像 name, timestamp, value

【问题讨论】:

    标签: angular typescript web-services callback


    【解决方案1】:

    你的承诺永远不会解决,它需要在最后调用 resolve(myResultJsonDatas) 才能工作

    下面的例子:

      getData(): Promise<string> {
        return new Promise(resolve => {
          // Some code
          resolve('myResult');
        })
      }
    

    【讨论】:

    • 谢谢,什么是'myResultJsonDatas'?我需要返回的值在异步函数 main() {... const download = await blobToString(await downloadBlockBlobResponse.blobBody) } 中。但是如何将这个值传递给 resolve 的参数呢?抱歉这些问题,我是 Angular 的初学者
    • 我不熟悉异步语法,但你需要做这样的事情 resultData = await main().catchError(err => { console.error('message'); return null ; });解决(结果数据);
    • 谢谢,但是我需要在 NgOnInit 函数上调用 resultData 吗?因为 test.component.ts 模块将如何接收关于 resultData 的信息?
    • resultData 是 promise 的一个局部变量,resolve 函数会将它“转移”到这里组件中的 results 变量中:“this.jsonService.getData().then(results”
    • 好的,谢谢你的解释。所以 console.log(this.jsonService) 实际上应该返回看起来像这样的 json 字符串 {"name": "Michael"; “时间戳”:“1598207249”; “价值”:23 } ?但不知何故,我得到了元数据(见原帖中的图片)。我想我搞砸了这些功能。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2021-08-16
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多