2015-10-20 89 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++; 
     }); 
    }); 
});`