连续写入服务器中的多个文件

时间:2017-02-21 16:35:28

标签: node.js asynchronous angular-promise debouncing angularjs-watch

(*由于my previous question或多或少得到了回答,并且代码已经发展,我打开了一个新问题。*)

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

enter image description here

**********我写的是什么**********

在html文件中,我为每个文件添加一个控制器,以便我可以准确地跟踪textarea中更改的文件。然后,我只需要将该文件保存到服务器,而不是所有文件:

<div ng-repeat="file in files track by $index" ng-controller="fileCtrl">
    <a ng-click="go(file)">{{file.name}}</a>
</div>

控制器:

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

codeService

app.service('codeService', ['$http', function ($http) {
    this.render = function (files, changedFile) {
        $http.post('/writeFile', changedFile);
    };
}]);

路由器:

router.post('/writeFile', function (req, res, next) {
    var file = req.body;
    var fs = require('fs');
    fs.writeFile("public/tmp/" + file.name, file.body, function (err) {
        if (err) { return console.log(err) };
    });
});

**********我的测试**********

我的测试显示textarea中的修改很好地被捕获,并且修改后的文件可以或多或少地保存到服务器:它对于第1版和第2版的作品非常有效,但它经常遇到麻烦随后的着作

**********我的问题**********

任何人都可以帮我重新构建代码以便妥善处理:

  1. 对作品进行异步调用,以便所有作品都能很好地(并且快速地)进行。
  2. debounce的着作,这意味着我们可以在每次保存之前等待一点。但是当我们有几个文件时,这有点棘手:假设我们可以在文件之间切换非常快,在这种情况下如何debounce和异步保存执行?

1 个答案:

答案 0 :(得分:1)


1.以下是plunker http://plnkr.co/edit/NerwghZaqcRuoswHYPlq?p=preview,您可以使用去抖动和异步功能。
2.在文件切换速度非常快并输入不同文件后,只会将最后一个结果发送到服务器
3.如果从BE获得错误,请不要忘记处理错误(在每次$ http调用到服务器后添加catch())
4.在Node Js方面,请添加简化任务的promise库。我个人更喜欢Bluebird http://bluebirdjs.com/docs/api/promise.all.html

var files = [];
for (var i = 0; i < 100; ++i) {
    files.push(fs.writeFileAsync("file-" + i + ".txt", "", "utf-8"));
}
Promise.all(files).then(function() {
    console.log("all the files were created");
});

希望有所帮助