【问题标题】:return results from a function (javascript, nodejs)从函数返回结果(javascript、nodejs)
【发布时间】:2011-11-07 12:43:03
【问题描述】:

有人可以帮我处理这段代码吗?我需要从 routeToRoom 函数返回一个值:

var sys = require('sys');

function routeToRoom(userId, passw) {
    var roomId = 0;
    var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')());
    var users = nStore.new('data/users.db', function() {

        users.find({
            user: userId,
            pass: passw
        }, (function(err, results) {
            if (err) {
                roomId = -1;
            } else {
                roomId = results.creationix.room;
            }
        }
        ));
    });
    return roomId;
}
sys.puts(routeToRoom("alex", "123"));

但我总是得到:0

我猜return roomId;roomId=results.creationix.room 之前执行。有人可以帮我处理这段代码吗?

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:
    function routeToRoom(userId, passw, cb) {
        var roomId = 0;
        var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')());
        var users = nStore.new('data/users.db', function() {
            users.find({
                user: userId,
                pass: passw
            }, function(err, results) {
                if (err) {
                    roomId = -1;
                } else {
                    roomId = results.creationix.room;
                }
                cb(roomId);
            });
        });
    }
    routeToRoom("alex", "123", function(id) {
        console.log(id);    
    });
    

    您需要使用回调。这就是异步 IO 的工作原理。顺便说一句,sys.puts 已弃用

    【讨论】:

    • 是否存在这样的格式?var roomId = takeRoom("alex","123");我的问题是我需要将结果保存到“全局”变量中才能在其他函数中使用。谢谢!
    • @profesoralex 你做错了。重写你的代码。节点是异步的。学习异步编写。
    【解决方案2】:

    您正在尝试以同步方式执行an asynchronous function,不幸的是not possible in Javascript

    正如您猜对的那样,roomId=results.... 在从数据库加载完成时执行,这是异步完成的,因此在您的代码恢复完成之后。

    看这篇文章,讲的是.insert and not .find,但思路是一样的:http://metaduck.com/01-asynchronous-iteration-patterns.html

    【讨论】:

    • 感谢您的回复,安杰!链接metaduck.com/post/2675027550/… 失效了,你有其他来源吗?谢谢!
    • 我刚刚重新格式化了你的问题; Simone 提供了这个答案(你可以从右边的名字看出,就在这些 cmets 的上方)。
    • 奇怪,它从这里开始工作.. 但是,在谷歌上搜索“nodejs 异步模式”,你会找到一些文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2020-05-11
    • 2016-03-11
    • 1970-01-01
    • 2020-03-06
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多