Javascript NodeJs:如何跨多个文件使用承诺?

Javascript NodeJs:如何跨多个文件使用承诺?,javascript,node.js,Javascript,Node.js,我最初有一个文件,它有一个承诺,工作非常好,但后来我意识到我将重用这些函数很多,所以决定创建一个新的文件来保存函数并使用module.export,这样我就可以随时随地访问它。如果我在新文件(GlobalResource.js)中输入console.log crop_inventory,则得到1000,这是正确的,但当我尝试访问原始文件中的数据时,得到0 homeController.js var ResourceGlobal = require('../global/globalResour

我最初有一个文件,它有一个承诺,工作非常好,但后来我意识到我将重用这些函数很多,所以决定创建一个新的文件来保存函数并使用module.export,这样我就可以随时随地访问它。如果我在新文件(GlobalResource.js)中输入console.log crop_inventory,则得到1000,这是正确的,但当我尝试访问原始文件中的数据时,得到0

homeController.js

var ResourceGlobal = require('../global/globalResources/ResourcesGlobal');

app.get('/game/:gameid/home', function(req,res){
    if(global.gameId == req.params.gameid){
        setResourceInventory().then(function(){
            console.log(ResourceGlobal.crop_inventory)//I get 0, here even though it should be 1000
            res.render('GameEngine/home/gameHome');
        });
    } else{
        res.send(500, "Not authorized to view this page.");
    }
});


function setResourceInventory(){
    return new Promise(function(resolve,reject){
        Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()]).then(function(){
            resolve();
        });
    });
}
ResourceGlobal.js

var db = require('../../../../db');


module.exports = {

//Resources
crop_inventory: 0,
lumber_inventory: 0,
ore_inventory: 0,
oil_inventory: 0,

//Function gets crop inventory and sets global variable
getCrop: function(){
    return new Promise(function(resolve,reject){
        let sql = "SELECT Crop_Inventory FROM resources WHERE resources_FK_PlayerId = (?) AND resources_FK_GameId = (?)";
        var value = [global.id, global.gameId];
        db.query(sql, value, function(err,result,fields){
            if(err){
                console.log(err);
            } else{
                crop_inventory = result[0].Crop_Inventory;
                console.log(crop_inventory) //I get 1000 which is correct
                resolve();
            }
        });
    })
}
}

//3更多功能适用于木材、矿石和石油

,您需要传递要解析的值。此外,如果出现错误,您应该拒绝承诺。因此,在您的情况下,
getCrop()
应该是:

getCrop: function(){
    return new Promise(function(resolve,reject){
        let sql = "SELECT Crop_Inventory FROM resources WHERE resources_FK_PlayerId = (?) AND resources_FK_GameId = (?)";
        var value = [global.id, global.gameId];
        db.query(sql, value, function(err,result,fields){
            if(err){
                console.log(err);
                reject(err);
            } else{
                crop_inventory = result[0].Crop_Inventory;
                console.log(crop_inventory) //I get 1000 which is correct
                resolve(crop_inventory);
            }
        });
    })
}
function setResourceInventory(){
    return new Promise(function(resolve,reject){
        Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()]).then(function(data){
            resolve(data);
        });
    });
}
现在,当它里面的所有承诺都得到解决时,它就会得到解决。它将解析为一个数组,该数组以相同的顺序包含每个承诺的解析值。因此,
setResourceInventory()
应该是:

getCrop: function(){
    return new Promise(function(resolve,reject){
        let sql = "SELECT Crop_Inventory FROM resources WHERE resources_FK_PlayerId = (?) AND resources_FK_GameId = (?)";
        var value = [global.id, global.gameId];
        db.query(sql, value, function(err,result,fields){
            if(err){
                console.log(err);
                reject(err);
            } else{
                crop_inventory = result[0].Crop_Inventory;
                console.log(crop_inventory) //I get 1000 which is correct
                resolve(crop_inventory);
            }
        });
    })
}
function setResourceInventory(){
    return new Promise(function(resolve,reject){
        Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()]).then(function(data){
            resolve(data);
        });
    });
}
因此,现在您可以通过以下方式访问数据:

setResourceInventory().then(function(data){
    console.log(data[0]); //getCrop value
    console.log(data[1]); //getLumber value
    res.render('GameEngine/home/gameHome');
});
在中,您需要传递要解析的值。此外,如果出现错误,您应该拒绝承诺。因此,在您的情况下,
getCrop()
应该是:

getCrop: function(){
    return new Promise(function(resolve,reject){
        let sql = "SELECT Crop_Inventory FROM resources WHERE resources_FK_PlayerId = (?) AND resources_FK_GameId = (?)";
        var value = [global.id, global.gameId];
        db.query(sql, value, function(err,result,fields){
            if(err){
                console.log(err);
                reject(err);
            } else{
                crop_inventory = result[0].Crop_Inventory;
                console.log(crop_inventory) //I get 1000 which is correct
                resolve(crop_inventory);
            }
        });
    })
}
function setResourceInventory(){
    return new Promise(function(resolve,reject){
        Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()]).then(function(data){
            resolve(data);
        });
    });
}
现在,当它里面的所有承诺都得到解决时,它就会得到解决。它将解析为一个数组,该数组以相同的顺序包含每个承诺的解析值。因此,
setResourceInventory()
应该是:

getCrop: function(){
    return new Promise(function(resolve,reject){
        let sql = "SELECT Crop_Inventory FROM resources WHERE resources_FK_PlayerId = (?) AND resources_FK_GameId = (?)";
        var value = [global.id, global.gameId];
        db.query(sql, value, function(err,result,fields){
            if(err){
                console.log(err);
                reject(err);
            } else{
                crop_inventory = result[0].Crop_Inventory;
                console.log(crop_inventory) //I get 1000 which is correct
                resolve(crop_inventory);
            }
        });
    })
}
function setResourceInventory(){
    return new Promise(function(resolve,reject){
        Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()]).then(function(data){
            resolve(data);
        });
    });
}
因此,现在您可以通过以下方式访问数据:

setResourceInventory().then(function(data){
    console.log(data[0]); //getCrop value
    console.log(data[1]); //getLumber value
    res.render('GameEngine/home/gameHome');
});

为了便于将来参考,您的
setResourceInventory()
功能可以简化为:

function setResourceInventory(){
        return Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()])
}

Promise.all()
返回一个可启用的Promise。

为了便于将来参考,可以简化您的
setResourceInventory()
函数:

function setResourceInventory(){
        return Promise.all([ResourceGlobal.getCrop(), ResourceGlobal.getLumber(), ResourceGlobal.getOre(), ResourceGlobal.getOil()])
}
Promise.all()
返回一个不可用的承诺