Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对服务器中文件的连续写入速度较慢_Javascript_Angularjs_Node.js_Asynchronous_File Writing - Fatal编程技术网

Javascript 对服务器中文件的连续写入速度较慢

Javascript 对服务器中文件的连续写入速度较慢,javascript,angularjs,node.js,asynchronous,file-writing,Javascript,Angularjs,Node.js,Asynchronous,File Writing,我想用MEAN stack来构建一个简单的游乐场,模仿plunker:我们在左手边有一个文件列表和一个文本区域,在右手边有一个实时预览。请注意,文件保存在临时文件夹中,实时预览是由该临时文件夹中的文件注入的iframe 我已经编码了一些东西。在前端,控制器监视文本区域中文件的修改;每次有更改时,将调用render,并发送$http.post以保存所有文件的新版本 app.controller('Ctrl', ['$scope', 'codeService', function ($scope,

我想用MEAN stack来构建一个简单的游乐场,模仿plunker:我们在左手边有一个文件列表和一个文本区域,在右手边有一个实时预览。请注意,文件保存在临时文件夹中,实时预览是由该临时文件夹中的文件注入的
iframe

我已经编码了一些东西。在前端,控制器监视文本区域中文件的修改;每次有更改时,将调用
render
,并发送
$http.post
以保存所有文件的新版本

app.controller('Ctrl', ['$scope', 'codeService', function ($scope, codeService) {
    ...
    $scope.$watch('files', function () {
        codeService.render($scope.files)
    }, true);
}]);

app.service('codeService', ['$http', function ($http) {
    this.render = function (files) {
        ...
        var arrayLength = files.length;
        for (var i = 0; i < arrayLength; i++) {
            $http.post('/writeFile', files[i]);
        }
    }
}
我的测试表明,对于第一次修改,它确实写入了服务器中的文件。但是,对于连续修改,第二次和后续写入每次可能需要20秒以上

有人知道是什么减慢了写作速度吗(除了第一个)

此外,我应该以异步方式调用
$http.post('/writeFile',files[I])
还是写入
router.post('/writeFile'.

编辑1:

我还想知道以以下方式编写http请求是否正确(我是否在同步函数(即,
render
)中有一个异步函数(即http post)?我是否应该使
render
异步?:


您可以尝试重构代码并包括以下内容:

1) 将你的观察者包装成去盎司函数

它可以防止无用的呼叫

2) 使用
writeFile
而不是
writeFileSync

fs.writeFile("public/tmp/" + file.name, file.body, (err) => {
  if (err) throw err;
  console.log('It\'s saved!');
});

在异步函数中,请尽量避免在代码中使用同步调用。

不要使用
fs。writeFileSync
,请使用异步版本^This。同步功能背后的全部想法是它们正在阻塞。谢谢。。。请查看我的更新…回答您的问题,用以下方式编写http请求是否正确?简短的回答是“否”。请提出一个单独的问题,我将向您解释如何处理连续异步调用。以下是。。。
app.service('codeService', ['$http', function ($http) {
    this.render = function (files) {
        ...
        var arrayLength = files.length;
        for (var i = 0; i < arrayLength; i++) {
            $http.post('/writeFile', files[i]);
        }
    }
}
o.create = function (post) {
    return $http.post('/posts', post, {
        headers: { Authorization: 'Bearer ' + auth.getToken() }
    }).success(function (data) {
        o.posts.push(data)
    });
};
$scope.$watch('files', _.debounce(function () {
        codeService.render($scope.files)
    }, 1000), true);
fs.writeFile("public/tmp/" + file.name, file.body, (err) => {
  if (err) throw err;
  console.log('It\'s saved!');
});