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