在javascript中获取嵌套异步函数的变量

Posted

技术标签:

【中文标题】在javascript中获取嵌套异步函数的变量【英文标题】:Get variable of nested async function in javascript 【发布时间】:2015-03-13 07:30:43 【问题描述】:

我有一个嵌套回调函数的问题,我需要一个变量。

所以我有一个 socketio 连接,客户端发出一个“getsettings”以通过回调获取一些数据

客户:

Socket.emit('getSettings', function (err, res) 
    console.log('Settings retrieved');
    console.log(res);
    $scope.ip = res.ip;
    $scope.port = res.port;
);

nodejs 服务端的回答如下,注释掉的代码不会像我希望的那样运行。

nodejs-服务器:

socket.on('getSettings', function (placeholder, callback) 

    console.log('Settings are broadcasted.');
    // this following "data" variable shall be omitted once the find() problem is solved 
    var data = 
        ip: '192.168.188.32',
        port: '9000'
    ;

    // Here I try to get the data from mongodb-database collection "lmssettings"
    // via the mongoose-function find().
    // This won't work because of its async behavior
    //
    // lmsSettings.find(, function (err, res) 
    //    data = res;
    // );

    callback(false, data); 
);

我是 JS 的新手并且阅读了很多关于它的内容,所以我知道这是 mongoose 的 find 函数的异步行为的问题,但我不知道如何更改代码,它将正常工作。

希望有人能给我一些提示。提前谢谢...

【问题讨论】:

没有被注释掉的data变量只是占位符数据吗? callback(false, data); 放在lmsSetting 的回调中 @adeneo 将您的评论作为答案(确实如此),以便 OP 可以接受:) 我已经回答了你的问题(已经发布),但只有一个问题:你为什么要设置数据,然后再重新设置它,而不使用它。有什么意义? @SimpleJ 你的意思是函数中的数据(数据,回调)。我想是的,试图省略它,但随后socketio连接崩溃了。我将对其进行编辑,以免混淆 【参考方案1】:

异步函数有一个回调,使用从 .find 回调接收到的数据 (res) 并将其传递给您的 callback 函数:

socket.on('getSettings', function (data, callback) 

    console.log('Settings are broadcasted.');

    lmsSettings.find(, function (err, res) 
        callback(false, res); 
    );
);

我认为这应该可以解决您的问题。

【讨论】:

妈的,就是这样。我已经有过这样的了。它不起作用的原因是 grunt 没有在我的测试机器上运行。感谢一切 我已经尝试过了,但我是新手,无法投票。 :/希望其他人可以投票。也许您可以省略“var data = ip ...” - 解决方案的一部分。认为它更令人困惑然后很有帮助,因为无论如何数据都会在 find() 函数中被覆盖...... 已修复。哦,我忘记了。但我几乎可以肯定你可以接受答案,那就是checkmark beneath the upvote counter。

以上是关于在javascript中获取嵌套异步函数的变量的主要内容,如果未能解决你的问题,请参考以下文章

使用jmeter中_javaScript函数和__substring函数嵌套截取字符串变量做传参

JavaScript之静态作用域与动态作用域 #yyds干货盘点#

嵌套异步函数

javaScript-promise

js异步请求发展史和yield

JavaScript学习--Item27 异步编程异常解决方案