作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习 SSO 并在没有传统的 User
类/对象的情况下进行尝试。我是异步编程的新手,在管理数据流方面有困难。我被困在成功导出 boolean
值的位置,但我的导入(在另一个模块中)得到 undefined
。我怀疑是因为import没有等到对应的export语句先执行。我如何让它和所有后续代码等待?
我不知道在这种情况下该尝试什么。
正在导出 usrFlag
const request = require("request");
let usrFlag = false; // assuming user doesn't already exist.
function workDB(usr_id, usr_name, dateTimeStamp) {
//some code excluded - preparing selector query on cloudant db
request(options, function (error, response, body) {
if (error) throw new Error(error);
if (body.docs.length == 0) addUsr(usr_id, usr_name, dateTimeStamp);
else {
xyz(true); //This user already exists in cloudant
console.log('User already exists since', body.docs[0].storageTime);
}
});
}
async function setUsrFlag(val) { usrFlag = val; }
async function xyz(val) {
await setUsrFlag(val);
//module.exports below does not execute until usrFlag has the correct value.
//so value is not exported until usrFlag has been properly set.
console.log(usrFlag);
module.exports.usrFlag = usrFlag;
}
正在导入此值的模块
const usrP = require('../config/passport-setup');
const dbProcess = require('../dbOps/dbProcessLogic'); // <-- This is import
router.get('/google/redirect', passport.authenticate('google'), (req, res) => {
dbProcess.workDB(usrP.usrPrf.id, usrP.usrPrf.displayName, new Date());
// Instead of true/false, I see undefined here.
console.log(dbProcess.usrFlag);
});
我希望导入模块的 require 函数等待导出模块向它发送所有必需的值。但是,我知道如果我没有明确告诉它这样做,这可能不会发生。我的问题是,怎么做?
最佳答案
所以,我刚刚修改了一些代码,以便我可以轻松地处理它。
usrFlag
// const request = require("request");
let usrFlag = false; // assuming user doesn't already exist.
function workDB(usr_id, usr_name, dateTimeStamp) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
xyz(true).then(function () {
resolve('done');
})
}, 1000);
});
}
function setUsrFlag(val) { usrFlag = val; }
function xyz(val) {
return new Promise(function (resolve, reject) {
setUsrFlag(val);
module.exports.usrFlag = usrFlag;
resolve('done');
});
}
module.exports = {
usrFlag,
workDB
}
值
的模块const dbProcess = require('../dbOps/dbProcessLogic'); // <-- This is import
dbProcess.workDB().then(function () {
console.log(dbProcess.usrFlag);
})
现在,当您运行第二个文件时,您会得到 usrFlag 为 true。我使用 setTimeout 来模拟请求。
抱歉,如果我破坏了您的一些代码。
关于node.js - 如何仅在稍后将值导出到其他地方后才在 Node js 中导入值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57720646/
我是一名优秀的程序员,十分优秀!