【问题标题】:Callback prints data but doesn't return it [duplicate]回调打印数据但不返回它[重复]
【发布时间】:2015-12-05 04:41:33
【问题描述】:

我正在使用 AWS JavaScript SDK 来处理 DynamoDB。

我编写了以下(简化的)函数来获取数据库中的表 -

var AWS = require('aws-sdk');
var db = new AWS.DynamoDB();
function getTables() {
        db.listTables(function(err, data) {
            console.log(data);
            return data;
        });
    }

当我执行以下操作时,我不明白为什么 -

x = getTables();

x 不会用数据初始化(保持undefined),但console.log(data) 会打印实际结果。

我意识到这是一个回调,但我成功打印了响应!这不像我试图在函数之外打印它,这会导致我试图打印尚未初始化的东西。我得到的响应初始化了 data 变量,这意味着它应该被打印然后返回!

我在这里缺少什么? 提前致谢

【问题讨论】:

    标签: javascript node.js amazon-web-services


    【解决方案1】:

    有几个问题。首先是你没有从你的getTables 函数返回。所以 x 永远是未定义的。

    第二个问题是您尝试从回调函数返回数据,该回调函数仅在未来某个时间执行,并将返回到执行它的 DynamoDB 库函数。您必须对传递给 db.listTables 的回调函数中的数据执行任何操作。您的数据被记录到控制台的原因是因为此时数据已被定义。

    这是一个示例供您查看。它试图解释数据库库的内部工作原理。

    var FakeDB = {
        listTables: function(callback){
            setTimeout(function(){
                // This is your callback here.
                callback(["table1", "table2"]); // This is your callback function, this is where you're returning data to. To some code in FakeDB, inaccessable to you.
    
                //If I were to use "var data = callback(...);", data would be whatever you return from your callback.
    
            }, 5000);
    
            return undefined; // This is what is getting returned to your function: nothing.
        }
    }
    
    var x;
    
    x = FakeDB.listTables(function(data){
        // This is where data is accessible
    
    });
    
    // x==undefined because that's what the listTables function returns.
    

    【讨论】:

    • 啊,我完全错过了我没有从 getTables 回来!但是我仍然没有得到第二部分......为什么这很重要? “返回数据”部分只在console.log之后执行,那为什么我不能将它返回到getTables函数,然后从那里返回到“main”呢?(我也无法做到。 ..)
    • 因为此时不再是您调用该函数。它是调用您传递给它的函数的 DynamoDB(在将来的某个任意时间点)。这更有意义吗?我可以写一个小例子来尝试澄清
    • 否 :( 我明白你在说什么,只是它没有解释为什么一旦“DynamoDB 完成调用我传递的函数”,它就无法将其结果返回给getTables 并从那里回到我的主要范围
    • 好吧,我加了一个例子。您应该查找调用堆栈。在深入研究这样的项目之前,您似乎可以使用更多的经验。但尝试是实现目标的好方法。
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多