javascript - 如何在嵌套函数调用中使用 promises

标签 javascript node.js promise

正如我认为我理解 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/

相关文章:

node.js - socket.io 无法连接到服务器

javascript - react native android native 模块 promise 不会解决或拒绝

javascript - 使用 Promise 观察游标并停止游标

javascript - 在 react 中以编程方式创建五个要点?用户可以添加任务,但我想从初始可变数量的项目符号开始

javascript - 多个日期选择器 JavaScript

javascript:如果用户名存在,则不提交表单

javascript - 将图像图标从一个导航菜单列表项移动到另一个

node.js - 硬件和 Web 组件之间的实时通信协议(protocol)是什么?

javascript - 使用 React/ReduxReducer 进行正确的密码管理

javascript - 由于数据库调用,在 Promise 中使用异步。我该如何修复这个反模式?