连续写入服务器中的多个文件
Consecutive writings to several files in the server
(* 由于 已经或多或少得到了回答,代码也有所改进,我打开一个新问题。 *)
我想用模仿 plunker 的 MEAN 堆栈构建一个简单的游乐场:我们在左侧有一个文件列表和一个文本区域,在右侧有一个实时预览。请注意,文件保存在一个临时文件夹中,实时预览是由该临时文件夹中的文件注入的 iframe
。
********** 我写了什么 **********
在 html 文件中,我为每个文件添加了一个控制器,这样我就可以准确跟踪文本区域中更改的文件。然后,我只需要将该文件保存到服务器,而不是所有文件:
<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中的修改被很好地捕获,并且修改后的文件或多或少可以保存到服务器:它对于第一个,第二个写作来说效果很好,但是它.
后面的文章经常出问题
********** 我的问题 **********
谁能帮我重新构建代码以更好地处理:
- 写作的异步调用,这样所有的写作都很好(并且很快)进行了。
- 写作
debounce
,这意味着我们可以在每次保存之前稍等片刻。但是当我们有多个文件时它有点棘手:假设我们可以在文件之间切换非常快,在这种情况下debounce
和异步保存如何执行?
1. 这里是 plunker
http://plnkr.co/edit/NerwghZaqcRuoswHYPlq?p=preview 给你的,你可以在这里玩去抖动和异步功能。
2.一旦你在文件之间快速切换并输入不同的文件,只有最后的结果会被发送到服务器
3. 如果您从 BE 获取错误,请不要忘记处理错误(在每次 $http 调用服务器后添加 catch())
4. 在 Node Js 端,请添加简化任务的承诺库。个人比较喜欢蓝鸟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");
});
希望对您有所帮助
(* 由于
我想用模仿 plunker 的 MEAN 堆栈构建一个简单的游乐场:我们在左侧有一个文件列表和一个文本区域,在右侧有一个实时预览。请注意,文件保存在一个临时文件夹中,实时预览是由该临时文件夹中的文件注入的 iframe
。
********** 我写了什么 **********
在 html 文件中,我为每个文件添加了一个控制器,这样我就可以准确跟踪文本区域中更改的文件。然后,我只需要将该文件保存到服务器,而不是所有文件:
<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中的修改被很好地捕获,并且修改后的文件或多或少可以保存到服务器:它对于第一个,第二个写作来说效果很好,但是它.
后面的文章经常出问题********** 我的问题 **********
谁能帮我重新构建代码以更好地处理:
- 写作的异步调用,这样所有的写作都很好(并且很快)进行了。
- 写作
debounce
,这意味着我们可以在每次保存之前稍等片刻。但是当我们有多个文件时它有点棘手:假设我们可以在文件之间切换非常快,在这种情况下debounce
和异步保存如何执行?
1. 这里是 plunker
http://plnkr.co/edit/NerwghZaqcRuoswHYPlq?p=preview 给你的,你可以在这里玩去抖动和异步功能。
2.一旦你在文件之间快速切换并输入不同的文件,只有最后的结果会被发送到服务器
3. 如果您从 BE 获取错误,请不要忘记处理错误(在每次 $http 调用服务器后添加 catch())
4. 在 Node Js 端,请添加简化任务的承诺库。个人比较喜欢蓝鸟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");
});
希望对您有所帮助