【问题标题】:Access the Resolve Value of a Promise访问 Promise 的 Resolve 值
【发布时间】:2020-05-30 15:06:48
【问题描述】:

我有一个承诺,可以解析Read Excel Service 中的变量this.data,如下所示,

  parseExcel(excelFile): Promise<any>
  {
    /* wire up file reader */
    const target: DataTransfer = <DataTransfer>(excelFile.target);
    if (target.files.length !== 1) throw new Error('Cannot use multiple files');
    const reader: FileReader = new FileReader();
    return new Promise((resolve, reject) => {
        reader.onload = (e: any) => 
        {
          /* read workbook */
          const bstr: string = e.target.result;
          const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });

          /* grab first sheet */
          const wsname: string = wb.SheetNames[0];
          const ws: XLSX.WorkSheet = wb.Sheets[wsname];

          /* save data */
          this.data = <AOA>(XLSX.utils.sheet_to_json(ws, { header: 1 }));
          console.log("BOM PARSE SERVICE LOG: " , this.data)
          resolve(this.data);
        };
        reader.readAsBinaryString(target.files[0]);
    })
}

我现在正尝试在此处访问已解析的数组

async ReadExcel(event)
  {
    return new Promise<Object>((resolve, reject) =>
    {
      var excelContents = this.parser.parseExcel(event).then(function(value)
      {
        return value
      }
      console.log("New Quote Component Log: ", excelContents)
      //need var excelContents to only contain the array and not contain the value of the promise object
    }
  )}
}

后一个函数中的日志语句让我回到了这个......

有没有办法让变量excelContents 只取数组的值而不是整个promise 的值?

【问题讨论】:

标签: javascript arrays typescript promise


【解决方案1】:

ReadExcel 函数中的问题是 .then() 总是返回 Promise 实例,而不是实际的解析值。 因此,通过执行let blabla = promise.then(v =&gt; {return v})blabla 变量将成为承诺,并且要访问解析值,您必须执行 blabla.then(v =&gt; ...)

这就是为什么当您console.log excelContents 变量时,您会看到一个具有两个属性的对象,状态,代表承诺的状态,值,即解析值。

如果您像我看到的那样使用异步函数,我建议您像这样使用 async/await:

async ReadExcel(event)
  {
    return new Promise<Object>(async(resolve, reject) =>
    {
      try {
          var excelContents = await this.parser.parseExcel(event)
          console.log("New Quote Component Log: ", excelContents)
          //need var excelContents to only contain the array and not contain the value of the promise object
          resolve(excelContents)
      } catch(e) {
         reject(e)
      }
    }
  )}
}

await promiseReturningFunc() 将返回解析值。

注意错误处理,始终使用 try/catch。

另外请注意,我在 Promise 处理程序中添加了异步。

【讨论】:

    【解决方案2】:

    无论你做什么,你都需要一些异步的东西来获得真实的、承诺的数据。同步获取显然没有希望。

    你尝试另一个new 承诺并没有帮助你更接近(事实上,它使用了the promise constructor antipattern)。做吧:

    async ReadExcel(event) {
        var excelContents = await this.parser.parseExcel(event);
        console.log("New Quote Component Log: ", excelContents);
    }
    

    要明确一点:不要误以为在后一个函数中返回 excelContents 会给你同步访问它。这不会给您带来任何好处,因为您将需要在另一个 async 函数中再次返回该返回值的 await。所以……就是这样。在async 函数中,在await 之后,用excelContents 做所有你需要做的事情。

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2019-06-20
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2015-11-15
      相关资源
      最近更新 更多