正如我认为我理解 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
返回一个 Promise
,因为你在上面使用了 .then()
。 then
返回一个 Promise
所以如果你想让 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();
关于javascript - 如何在嵌套函数调用中使用 promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55043176/