javascript - 如何在嵌套函数调用中使用 Promise
问题描述
就像我以为我理解承诺一样......我在下面我正在挣扎的地方评论了我的代码,但本质上,我只是不明白为什么当下面的代码运行时我得到以下结果
console.log("Finished Processing sheets")
console.log("Processing Errors")
console.log("sheet has completed processing")
当我预料到的时候
console.log("sheet has completed processing")
console.log("Finished Processing sheets")
console.log("Processing Errors")
这是代码。
module.exports = async function(file) {
var sheets = await readXLSX(file, { getSheets: true })
await Promise.each(Object.values(sheets), (sheet)=>{
readXLSX(file, { sheet }).then((data)=>{
//Process sheet data here
return processSheet(data)
})
})
console.log("Finished Processing sheets")
console.log("Processing Errors")
}
var processSheet = async function(data){
//Do some processing and write excel data to database
await db.table('some_table')
.insert(.....)
return new Promise((resolve, reject)=>{
console.log("sheet has completed processing")
resolve()
})
}
解决方案
我假设readXLSX
返回 aPromise
因为你使用.then()
它。then
返回 aPromise
所以如果你想Promise.each
按预期工作,你应该这样做return readXLSX(...).then(...);
这是一个简化代码的示例:
//Promise.each emulation
Promise.each = function(arr, fn) {
if(!Array.isArray(arr)) return Promise.reject(new Error("Non array passed to each"));
if(arr.length === 0) return Promise.resolve();
return arr.reduce(function(prev, cur) {
return prev.then(() => fn(cur))
}, Promise.resolve());
};
//readXLSX emulation
var readXLSX = function(val){
return new Promise(function(resolve, reject){
setTimeout(function() {
resolve(val);
}, 1);
});
};
var test = async function(file) {
var sheets = { foo: 'bar', foo2: 'bar2' }
await Promise.each(Object.values(sheets), (sheet)=>{
return readXLSX(sheet).then((data)=>{
//Process sheet data here
return processSheet(data)
});
})
console.log("Finished Processing sheets")
console.log("Processing Errors")
};
var processSheet = async function(data){
return new Promise((resolve, reject)=>{
console.log("sheet has completed processing", data)
resolve()
})
};
test();
推荐阅读
- php - 从 Picasa 迁移到 Googleapis
- javascript - 无法读取 null 的属性“toLowerCase”
- java - Spring Boot 与 devtools 调用 SOAP API
- php - 检查它是新的自定义帖子还是使用 save_post 钩子更新
- c++ - 多条件模板特化 c++
- javascript - 故障css文件
- javascript - 如何为气泡设置边界并根据命令触发移动?
- javascript - Google Apps 脚本多个在 Google 表格中查找和替换正则表达式
- sql - 如何在不重复行的情况下将具有相同架构的两个数据集连续合并在一起?
- node.js - 定时器函数 reactJS 和 NodeJS