javascript - 如何在Javascript中异步使用对象?

标签 javascript node.js express

在进入查询之前,问题对象已定义,在问题查询内部它是未定义的。我尝试了同类型帖子中提到的解决方案,但没有成功。代码中的注释进一步解释了该问题。

var createIssues = function createIssues(rows, wrap) {
    var issues = [];

    for (var i = 0; i < rows.length; i++) {

        // Processing code redacted

        issues.push({
            id       : rows[i].id,
            // Other field redacted
        });


        // ISSUES OBJECT CORRECT HERE
        console.log(JSON.stringify(issues[i]))

        // Query comments for individual post

        connection.query(
            "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id,
            function (err, rows_comments) {

                // ISSUES OBJECT UNDEFINED HERE
                console.log(JSON.stringify(issues[i]))

                // More code redacted
            }
        )
    }

    return issues;
}

我尝试将它作为函数传递,类似于我在网上的解释中找到的方式,但现在它说“TypeError:未定义不是函数”

var createIssues = function createIssues(rows, wrap) {

    var issues = []; // Create issues array

    // Loop throug every issue that was
    // returned by the SQL query.
    for (var i = 0; i < rows.length; i++) {

      // Redacted processing code

        issues.push({
            id       : rows[i].id,
            // Redacted extra fields
        });

        (function(issues) {

            connection.query(
                "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id,
                function (err, rows_comments) {

        // Can't access issues here, undefined

                }
            )

        })(issues);

    }

    return issues;
}

最佳答案

这里的问题是您将整个问题数组传递到您的 iife 中,而不是仅将单个问题数组传递到您的 iife 中,从而使 iife 毫无意义,因为它没有解决它应该解决的问题。

    (function(issue) {

        connection.query(
            "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id,
            function (err, rows_comments) {

                // worky

            }
        )

    })(issues[i]);

也就是说,您可以通过使用适用于所有数组的 forEach 方法来完全避免此问题。如果您有一个数组,并且需要以步长 1 对其进行循环,则没有理由不使用数组方法而不是 for 循环。

var createIssues = function createIssues(rows, wrap) {

    var issues = []; // Create issues array

    // Loop throug every issue that was
    // returned by the SQL query.
    rows.forEach(function (row, index) {

      // Redacted processing code
        var issue = {
            id       : row.id,
            // Redacted extra fields
        }
        issues.push(issue);

        connection.query(
            "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id,
            function (err, rows_comments) {

                // worky

            }
        )
    });

    return issues;
}

但请注意,issues 将在所有异步工作完成之前返回到调用范围,这意味着您在 //worky 处执行的任何操作> 评论要过一段时间才会生效。

关于javascript - 如何在Javascript中异步使用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32593440/

相关文章:

javascript - 如何在输入文本字段 HTML 中添加序列号

node.js - 从 KOA 中间件内部的 Promise 调用 Yield

node.js - nodejs 挂起 express 静态文件

express :req.query 和 req.body 有什么区别

javascript - 如何通过路由器从 html 表单传递字符串以生成和存储对象?

javascript - 需要 jQuery 鼠标悬停或悬停帮助

javascript - UI5 中的 const 和 let 声明

javascript - Angular Js 初学者 Ajax 调用

javascript - AWS Lambda 不等待来自 DynamoDB 的 Promise.all()

node.js - google.gmail() 给出错误 TypeError : google. gmail 不是函数?