AngularJS错误:regeneratorRuntime未使用异步函数定义

时间:2019-01-20 10:08:39

标签: angularjs asynchronous

我正在与angularjs合作,我想执行一些与读取文件数据相关的代码,我想完全执行此功能,然后开始执行另一段代码。

科学,我在控制器中使用了“异步”关键字,但出现此错误

  

regeneratorRuntime未定义

这是我的异步函数定义:

 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
}
)};

1 个答案:

答案 0 :(得分:0)

如果babelrc中的目标浏览器/节点版本不支持异步和等待,则它们将被转换为生成器函数或类似的函数,并且您未安装babel-plugin-transform-runtime插件。有多种解决方法,例如安装preset-envbabel-plugin-transform-runtime并将其包含在babelrc中-See here

此代码块也存在另一个问题。异步功能不会返回可以解决的承诺。链接到异步函数的任何后续函数将立即执行,从而使异步/等待无用。也许这是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);
}
)};