首页 > 解决方案 > 如何在嵌套函数调用中使用 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()
})
}

标签: javascriptnode.jspromise

解决方案


我假设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();


推荐阅读