0
我想發送一個ajax請求,從ftp服務器檢索文件名列表。 檢索文件不是問題,但是當我通過我的ajax請求(單擊我的index.ejs文件中的按鈕)時,它會在完成獲取所有文件之前呈現視圖(res.render中的文件變量爲空) 。我試過使用異步並行,但執行要麼停留在searchFiles函數中,要麼在函數執行前呈現視圖。 有什麼想法? (我想我的回撥方式是錯誤的,我不知道如何)。Node.js回調,等待函數結束
在我server.js文件:
var Files = require('./prototypes/files.js');
var files, searchedFiles;
app.get('/search', function (req, res) {
files = new Files();
files.searchFiles(req.query.t, function(searchedFiles) {
console.log(searchedFiles);
res.render('index', {files: searchedFiles});
});
});
在我files.js文件:
function Files() {
}
Files.prototype.searchFiles = function(searchedText, callback) {
var connectionProperties = {
host: "host",
user: "username",
password: "password"
}
var folders = ["", "0-9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X-Z"];
var Client = require('ftp');
var c = new Client();
var files = {};
c.on('ready', function() {
folders.forEach(function(folder) {
c.list("/pools/A/A0/Movies/Films/" + folder, function (err, list) {
if (err) throw err;
list.forEach(function (element, index, array) {
if (element.name.match("(mkv|avi|mp4|mov)$") && (element.name.toLowerCase().indexOf(searchedText.toLowerCase()) > -1)) {
console.log(element.name);
files[element.name] = element.size;
}
});
});
});
});
c.connect(connectionProperties);
callback(files);
}
module.exports = Files
在我index.ejs文件我這有塊腳本:
<div id="container">
<% if (typeof files !== 'undefined' && files) { for (file in files) { %>
<p><%= file + " ----- " + files[file] %></p>
<% }} %>
</div>
<button onclick="getFiles(); return false; %>">LOL</button>
<script>
function getFiles() {
searchedText = 'wild'; // wild is used as an example here
if (searchedText != "") {
$.ajax({
type: 'GET',
cache: false,
url: "http://localhost:8080/search?t=" + searchedText,
success: function(data) {
$('#container').html(data);
}
});
}
}
</script>
'回調(文件);'應行之後'文件[element.name] = element.size;' – Rayon
@RayonDabre:它的工作原理,但只返回在發送錯誤之前,數組的第一個元素:'錯誤:發送後無法設置標頭。' –
'list.forEach'是否執行任何異步操作? – Rayon