2017-02-21 65 views
1

我想用MEAN堆棧來構建一個模擬plunker的簡單操場:左側有一個文件和一個textarea列表,右側有一個實時預覽。請注意,文件保存在臨時文件夾中,實時預覽是由該臨時文件夾中的文件注入的iframe對服務器中文件的連續寫入很慢

enter image description here

我有編碼的東西。在前端,控制器監視textarea中文件的修改;每次發生變化時,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]); 
     } 
    } 
} 

在後端:

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

我的測試表明,對於第一修改中,這的確是寫入到服務器上的文件。但是,對於連續修改,第二個和後續寫入可能需要超過20秒EACH。

有沒有人知道什麼減慢了作品(第一個除外)?

此外,我應該撥打$http.post('/writeFile', files[i])或以異步方式寫router.post('/writeFile'...

編輯1:

我也想知道如果它是正確的寫入通過以下方式HTTP請求(我在具有同步功能內的異步函數(即,HTTP POST)(即, ?render)我應該讓render asynchonous):

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

當我看到在我的代碼中的其他HTTP請求,時尚往往喜歡

o.create = function (post) { 
    return $http.post('/posts', post, { 
     headers: { Authorization: 'Bearer ' + auth.getToken() } 
    }).success(function (data) { 
     o.posts.push(data) 
    }); 
}; 
+1

不使用'fs.writeFileSync',使用異步版本 – wong2

+0

^這。 \ * Sync功能背後的全部理念是它們阻止*。 – estus

+0

謝謝...請參閱我的更新... – SoftTimur

回答

1

您可以嘗試重構您的代碼,幷包括以下內容:

1)將您的觀察器包裹在去抖功能中。 https://lodash.com/docs/4.17.4#debounce

$scope.$watch('files', _.debounce(function() { 
     codeService.render($scope.files) 
    }, 1000), true); 

它可以防止無用電話

2)使用的writeFile代替writeFileSync

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

的功率異步功能的的NodeJS,儘量避免在你的代碼同步調用。

+0

謝謝...我仍然有一個問題,請參閱我的更新... – SoftTimur

+0

回答您的問題,以下面的方式編寫http請求是否正確?簡短的回答是否。請提出一個單獨的問題,我將向您解釋如何處理連續的異步呼叫。 – Cassidy

+0

好吧,我會寫另一個(複雜)問題... – SoftTimur