发布
社区首页 >问答首页 >Node.js回调,等待函数结束

Node.js回调,等待函数结束
EN

Stack Overflow用户
提问于 2015-10-20 08:00:50
回答 1查看 396关注 0票数 0

我试图发送一个ajax请求,该请求从ftp服务器检索文件名列表。检索文件不是问题,但当我传递ajax请求(单击index.ejs文件中的按钮)时,它在完成所有文件之前呈现视图( res.render中的文件变量为空)。我尝试过使用异步并行,但执行要么卡在searchFiles函数中,要么在函数执行之前呈现视图。有什么想法吗?(我想我是用错误的方式回拨的,我只是不知道怎么回事。)

在我的server.js文件中:

代码语言:javascript
代码运行次数:0
复制
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文件中:

代码语言:javascript
代码运行次数:0
复制
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文件中,我得到了这个块和脚本:

代码语言:javascript
代码运行次数:0
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 08:51:53

我找到了如何用异步,thx到@RayonDabre来解决这个问题。

在使用异步执行回调函数之前,我必须检查循环是否全部完成( javascript中的foreach循环被阻塞,因此必须使用异步)。

现在的代码是:

代码语言:javascript
代码运行次数:0
复制
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++;
        });
    });
});`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33231149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档