我正在使用 angularjs,我想执行一些与读取文件数据相关的代码,我想完全执行这个函数,然后开始执行另一个代码块。
科学我在我的 Controller 中使用了“async”关键字我得到了这个错误
regeneratorRuntime is not defined
这是我的异步函数定义:
async function fillFilesData() {
if (uploader.queue.length) {
uploader.queue.forEach(function (item) {
var reader = new FileReader();
reader.onloadend = function (e) {
console.log("about to encode");
var encoded_file = btoa(e.target.result.toString());
$scope.newAnnouncement.files.push({ fileName: item.file.name, encodedDatta: encoded_file });
};
reader.readAsBinaryString(item._file);
});
}
}
函数调用:
$scope.add = function () {
fillFilesData().then(function () {
//rest of my code here here
}
)};
最佳答案
如果 babelrc 中的目标浏览器/节点版本不支持异步和等待,并且您没有babel-plugin-transform-runtime
,则它们将被转换为生成器函数或类似的函数。插件已安装。有多种方法可以解决此问题,即安装 preset-env
,或babel-plugin-transform-runtime
并将它们包含在你的 babelrc 中 -- See here .
这段代码还有另一个问题。 async 函数不返回可以解析的 Promise。链接到 async 函数的任何后续函数都将立即执行,从而导致 async/await 无用。也许这是 100% 的示例代码,但我认为值得一提。
async function fillFilesData() {
let deferred = $q.defer();
if (uploader.queue.length) {
uploader.queue.forEach(function (item) {
var reader = new FileReader();
reader.onloadend = function (e) {
console.log("about to encode");
var encoded_file = btoa(e.target.result.toString());
$scope.newAnnouncement.files.push({ fileName: item.file.name, encodedDatta: encoded_file });
};
reader.readAsBinaryString(item._file);
});
deferred.resolve(/*something*/);
}else{
deferred.resolve(/*whatever*/);
}
return deferred.promise;
}
$scope.add = function () {
let res = await fillFilesData();
yourFunctionToWait(res);
}
)};
关于AngularJS错误: regeneratorRuntime is not defined with async function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275383/