首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么变量值在循环外不可用

为什么变量值在循环外不可用
EN

Stack Overflow用户
提问于 2019-12-20 23:46:39
回答 2查看 117关注 0票数 1

我是node.js的新手,但在编程方面却是老手。我从查询中获取值并将其放入数组中。这些值在数组创建过程中可用,但在外部不可用。控制台日志"new data“显示point有一个值。控制台日志点0显示未定义。这是我的代码。

代码语言:javascript
复制
    var polygon = [-89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52];
    var point = [];
    con.connect(function (err) {
        console.log("Connected4 " + polygon);
        var sql = 'select customer_num, latitude,longitude from gc.customers';  
        console.log("SQL = " + sql);
        con.query(sql, function (err, rows, fields) {
            if (err) throw err;
            for (var i = 0; i < rows.length; i++) {       
                   point[0] = rows[i].latitude;
                   point[1] = rows[i].longitude;
                   console.log("new row " + point[0] + " newpoint " + point[1]);                                
            }                      
        });                  
        console.log("point0= ", point[0], "polygon0 = ", polygon[0])
        const inside = require("point-in-polygon")(point, polygon)
        console.log('inside = ' + inside)
    });

这是我的控制台日志

代码语言:javascript
复制
node junksql.js
Connected4 -89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52
SQL = select customer_num, latitude,longitude from gc.customers
point0=  undefined polygon0 =  -89.72
inside=  false point0=  undefined vs0 =  -89.72
inside = false
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.472523 newpoint -81.473743
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.406973 newpoint -81.57685
new row 28.472523 newpoint -81.473743
new row 28.472523 newpoint -81.473743
^C
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-21 00:00:26

它是未定义的,因为它在con.query的回调函数之外。这里发生的情况是,您的代码不会等待回调完成,所以当它到达con.query(sql, function (err, rows, fields) {行时,它将继续执行console.log("point0= ", point[0], "polygon0 = ", polygon[0],同时计算回调块。有几种方法可以解决这个问题。这里有一个实现Promise的修复。

代码语言:javascript
复制
const sqlQuery = (query) => {
    return new Promise((resolve, reject) => {
        con.query(query, function (err, rows, fields) {
            if (err) return reject(err);
            return resolve (rows);
        });
    });
};

const polygon = [-89.72,34.27,-89.46,34.53,-89.44,34.53,-89.43,34.52];
let point = [];

con.connect(function (err) {
   sqlQuery('select customer_num, latitude,longitude from gc.customers')
        .then(results => {
            for (let i = 0; i < results.length; i++) {
                //note: this is probably not the best logic
                point[0] = results[i].latitude;
                point[1] = results[i].longitude;
            }
            const shape = require("point-in-polygon")(point, polygon);
            //do stuff with, or return, shape
        })
        .catch(err => {
            //handle error
        });
});

请注意,循环遍历结果,但将值分配给point[0]point[1]意味着如果有多个结果,则只会设置最后一对结果。根据您在这里期望发生的事情,有更好的方法来组织这一部分。

我在这里所做的关键更改是我用Promise包装了查询。这使我们能够确定在何处解决或拒绝promise中的逻辑。当promise返回时,您可以使用async/await对其进行await,也可以使用Promise.prototype.then()等待返回值。

票数 0
EN

Stack Overflow用户

发布于 2019-12-20 23:55:19

从您的console.log中可以清楚地看到,查询之外的所有内容都是首先运行的。

这就是所谓的Asynchronous behavior。这基本上意味着你不能从运行Asynchronously的函数获取外部值,因为Javascript/Node.js是同步语言(单线程),它不会等待你async function完成和console log它当前持有的任何值,默认情况下是undefined

人们对这种行为经常感到困惑,您可能想了解Event Loop是如何处理Node.Js和异步内容的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59427948

复制
相关文章

相似问题

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