javascript - 访问 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
只取数组的值而不是承诺的整个值?
解决方案
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 处理程序中添加了异步。
推荐阅读
- elasticsearch - Elasticsearch statefulset 不会在 rook-cephfs 上创建 volumesClaims
- python - sklearnmutual_info_classif 根据特征顺序返回不同的值
- c# - 1 个模型在一个视图中拆分为 3 个表,这可能吗?
- scala - scala并行集合上的地图在REPL中没有反应
- docker - Kubernetes,无法使用外部 IP 地址访问 Pod
- javascript - 作为数据属性传递给 JS 时找不到文件夹的 URL
- node.js - 节点画布 getImageData() 内存不足
- dart - 地图
到地图 > 在飞镖 - sql - 如何限制在我的 SQL Server 函数中返回的 ROWS 数量?
- css - 修复使用 iframe css 响应技巧时的填充问题