javascript - 等待带有回调的异步函数

标签 javascript typescript asynchronous

我有一个来自包模块的异步方法,带有回调函数。该方法本身返回未定义。

我对异步编码非常陌生,并且希望能够停止程序的执行,直到从回调方法为变量 arrayWithData 分配数据。

例如

let dataFiles = fs.etc   

function makeDataArray(dataFiles) {
   let arrayWithData = [];
   for (let dataFile in dataFiles) {
     package.magicMethodToParseData(dataFile, function(result){ //async method with callback
        arrayWithData.push(result) //happens later
     });
   }
   return arrayWithData; //This returns undefined
}

function doSomethingWithData(dataArray) {
   /* Doing Stuff with Data Array */
}

/* Broken Code with undefined */
doSomethingWithData( makeDataArray(dataFiles) );

我知道我可以将其余的执行添加到回调函数中,但希望避免这种情况并保持代码平坦。

如何等待数据分配给数组然后继续执行?

更新:添加了 github 测试器项目以展示完整的问题,因为 promise 不断被拒绝。 Github链接:https://github.com/Jonathan002/autofont.git

最佳答案

您可以使用 Promise.all 返回包含数组的 PromisePromise.all 的参数必须是一个 Promise 数组,并且它返回一个值数组的 Promise。

你可以像这样使用它:

function makeDataArray(dataFiles) {
  return Promise.all(dataFiles.map(function (dataFile) {
    return new Promise(function (resolve, reject) {
      package.magicMethodToParseData(dataFile, function (error, result) {
        if (error) {
          reject(error);
        } else {
          resolve(result);
        }
      });
    });
  }));
}

makeDataArray(dataFiles)
  .then(doSomethingWithData)
  .catch(console.error);

关于javascript - 等待带有回调的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893956/

相关文章:

javascript - 如何编写 Javascript API 包装器

javascript - TypeScript 包含流程

绑定(bind)对象函数时出现 C++ 异步错误

javascript - 将 html 附加到 div javascript 并将 typescript 函数绑定(bind)到(单击)事件不起作用

ios - 如何在 iOS UI 的后台线程中处理和显示返回的异步数据

c# - 什么时候应该在 ASP.NET MVC 中使用异步 Controller ?

javascript - 寻找没有提交按钮而无需重新加载的计算脚本

javascript - 我的代码是完美的,但我不知道为什么我发现了问题

javascript - 即使在运行digest()之后,在测试中编译 Angular Directive(指令)也会失败

javascript - 如何以 mat 形式将值变为小写