Node.js回调函数不起作用

时间:2018-05-28 15:39:16

标签: javascript node.js

我是node.js的初学者,我一直在研究一个简单的立方体计时器,但不幸的是,有些东西不起作用。在app.get中,当我运行sumOfSeconds(最好)时,会发生错误,告诉我有趣(sumOfSolves中的最后一行)不是函数。但是,当我尝试在app.get之外运行sumOfSeconds时(我也将更改返回到console.log以便我可以看到结果)一切正常。问题是什么? 在此先感谢;)

var sumOfSolves = [];

//create an array of total seconds in each time - used for Ao5, Ao12, best and worst
function sumOfSeconds(fun){
    Time.find({}, function(err, data){
        if(err) throw err;
        sumOfSolves = [];
        for(var i = 0; i < data.length; i++){
            sum = data[i].min * 60 + data[i].sec;
            sumOfSolves.push(sum);
        }
        fun(); //this makes best(), worst(), Ao5(), Ao12 execute after sumOfSeconds finished everything else, 
        //otherwise those functions run before the sumOfSolves array had something in ot and therefore the code didn't work
    })
}

function best(){
    var best = Math.min(...sumOfSolves);
    var position = sumOfSolves.indexOf(best);
    Time.find({}, function(err, data){
        if(err) throw err;
        var bestTime = data[position].time;
        return bestTime
    })
}
function worst(){
    var worst = Math.max(...sumOfSolves);
    var position = sumOfSolves.indexOf(worst)
    Time.find({}, function(err, data){
        if(err) throw err;
        var worstTime = data[position].time;
        return worstTime;
    })
}
function Ao5(){

}
function Ao12(){

}

module.exports = function(app){
    app.get('/', function(req, res){
        var best = sumOfSeconds(best);
        var worst = sumOfSeconds(worst);
        Time.find({}, function(err, data){
            if(err) throw err;
            res.render('index', {times: data, best: best, worst: worst});
        })
    });

1 个答案:

答案 0 :(得分:2)

您在best中将worstvar声明为app.get。不要这样做!为与函数声明不冲突的变量选择唯一的名称。

编辑: Javascript中的范围与任何其他语言一样重要,可能更多,因为整个脚本本质上是全局范围(全局范围可以访问嵌套范围中声明的变量)。

此外,几乎所有东西都是JS对象。 (有关6种基本类型,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures。)因此,与允许变量和函数具有相同名称的语言不同,在JS中,只能有一个给定名称的标识符。您“提升”了名称bestworst,因此JS引擎使用了您的新定义而不是函数。

如果您希望将来避免出现这类问题,并且不必担心支持旧浏览器,请使用let代替varlet警告你要提升。

此外,至少在开发期间,将:"use strict";放在源文件的顶部。