0

(* Как my previous question было более или менее отвечал, а код эволюционировал, я открываю новый вопрос. *)Последовательные письма к нескольким файлам на сервере

Я хочу построить простую игровую площадку с стеком MEAN который имитирует плункер: у нас есть список файлов и текстовая область слева, а также предварительный просмотр в правой руке. Обратите внимание, что файлы сохраняются во временной папке, а предварительный просмотр в реальном времени - это iframe, введенный файлами из этой временной папки.

enter image description here

**********, что я написал **********

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

********** my te sts **********

Мои тесты показывают, что модификация в текстовом поле хорошо поймана, а измененный файл может быть более или менее сохранен на сервере: он работает достаточно хорошо для 1-го , 2-й работы, но часто возникают проблемы для писем, которые следуют.

********** мои вопросы **********

Может кто-нибудь помочь мне реструктурировать код хорошо обращаться:

  1. асинхронный призывы сочинений, так что все сочинения хорошо (и быстро) выполняются.
  2. записи с debounce, это означает, что мы можем подождать немного перед каждой экономией. Но это немного сложно, когда у нас есть несколько файлов: предположим, что мы могли бы переключаться между файлами очень быстро, как бы debounce и асинхронное сохранение в этом случае?

ответ

1


1. Вот plunkerhttp://plnkr.co/edit/NerwghZaqcRuoswHYPlq?p=preview для вас, где вы можете играть с дребезга и асинхронных функций.
2. Как только вы переключаетесь между файлами очень быстро и вводите в разные файлы, только последний результат будет отправлен на сервер
3. Не забудьте обработать ошибки, если вы его получите от BE (add catch() после каждый вызов $ http на сервер)
4. И на стороне узла Js добавьте библиотеку обещаний, которая упростит вашу задачу. Лично я предпочитаю 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"); 
}); 

Надеется, что это помогает

+0

Так вы установите один наблюдатель для всех файлов и сохранять все 3 вещей, каждый раз.Если я сохраняю каждый раз все файлы, хотя есть только один, который был изменен, это будет довольно дорогостоящим, не так ли? Как я мог избежать этого? Есть ли быстрый способ определить, какие элементы были изменены? – SoftTimur

+1

http://plnkr.co/edit/Ggee8sDzZmiFyH9V7dmG?p=preview Да, просто добавьте ng-change внутри ng-repeat. check plunker for demo – Cassidy

+0

Решила ли ваша проблема? – Cassidy