我有一个来自包模块的异步方法,带有回调函数。该方法本身返回未定义。
我对异步编码非常陌生,并且希望能够停止程序的执行,直到从回调方法为变量 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
返回包含数组的 Promise
。 Promise.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/