2015-10-20 154 views
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> 
+0

'回调(文件);'应行之后'文件[element.name] = element.size;' – Rayon

+0

@RayonDabre:它的工作原理,但只返回在发送错误之前,数组的第一个元素:'错误:发送后无法设置标头。' –

+0

'list.forEach'是否执行任何异步操作? – Rayon

回答

1

我发现了如何与异步,THX什么办法能让@RayonDabre

我不得不检查,如果回路均使用异步做我的回调函数之前完成(在JavaScript中的foreach循环阻塞使异步有使用)。

的代码现在:

var i = 0; 
c.on('ready', function() { 
    folders.forEach(function(folder) { 
     c.list("/pools/A/A0/Movies/Films/" + folder, function (err, list) { 
      if (err) throw err; 
       var j = 0; 
       async.forEach(list, function (element, index, array) { 
       if (element.name.match("(mkv|avi|mp4|mov)$") && (element.name.toLowerCase().indexOf(searchedText.toLowerCase()) > -1)) { 
        files[element.name] = element.size; 
       } 
       if ((i == folders.length - 1) && (j == list.length - 1)) { 
        callback(files); 
       } 
       j++; 
      }); 
      i++; 
     }); 
    }); 
});`