首页 > 解决方案 > 访问 Promise 的 Resolve 值

问题描述

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

  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只取数组的值而不是承诺的整个值?

标签: javascriptarraystypescriptpromise

解决方案


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

这就是为什么当你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 处理程序中添加了异步。


推荐阅读