Javascript 当使用依赖于另一个模块输出结果的多个模块输出时,如何传递变量?
我有三个文件:user.js、influencer.js和validate.js 在user.js中,我导入./influencer(作为var=influencer)和./validate(作为var=validate) user.js中的我的函数:Javascript 当使用依赖于另一个模块输出结果的多个模块输出时,如何传递变量?,javascript,node.js,google-cloud-functions,Javascript,Node.js,Google Cloud Functions,我有三个文件:user.js、influencer.js和validate.js 在user.js中,我导入./influencer(作为var=influencer)和./validate(作为var=validate) user.js中的我的函数: addAccount: function(){ return functions.database.ref('/acct/{accountID}/name/').onCreate(event => { var accountID =
addAccount: function(){
return functions.database.ref('/acct/{accountID}/name/').onCreate(event => {
var accountID = event.params.accountID;
var name = JSON.stringify(event.data.val()).replace(/['"]+/g, '');
console.log("New Account Added ("+accountID+")");
console.log("Nickname: " +name);
influencer.getIG(name);
var data = influencer.data;
validate.validateThis(data);
});
}
<pre><code>
addAccount: function(){
return functions.database.ref('/acct/{accountID}/name/').onCreate(event => {
var accountID = event.params.accountID;
var name = JSON.stringify(event.data.val()).replace(/['"]+/g, '');
console.log("New Account Added ("+accountID+")");
console.log("Nickname: " +name);
function callback(err, res, data) {
var data = JSON.parse(body);
console.log(data);
validate.validateThis(data)
}
influencer.getIG(name, callback);
});
}
</pre></code>
使用influencer.getIG(name),我将上面定义的名称传递给函数getIG(influencer.js内部)。这很有魅力。结果是JSON主体
我现在要做的是获取这个JSON主体结果并将其传递给validate函数(在validate.js中)。在influencer.js中,我还添加了“exports.data=data;”
说到这里,我似乎不知道如何将“数据”传递给validate.js。我记录它,它返回未定义的。我在运行validateThis(数据)之前添加了一个超时,但仍然没有定义。验证功能本身工作得很好;我已经测试过了。但很明显,我并没有用正确的方式来做这件事
这是我的influencer.getIG函数:
module.exports = {
getIG: function (name) {
var url = "https://www.instagram.com/"+name+"/?__a=1"
console.log(url);
request({
url: url
}, function (error, response, body) {
var data = JSON.parse(body);
console.log(data);
exports.data = data;
})
}
}
如何将第二个模块的结果传递给函数中的第三个模块?我做错了什么?正如其他两位评论员所指出的,您有一个带有回调的异步函数。解决这个问题的一种方法是在user.js文件中定义回调,并将其传递给getIG函数。所以你会 user.js 这样,异步函数在influencer内部运行,然后在结果完成时调用用户。数据现在在用户文件可利用的范围内 另一种(更好的)方法是使用承诺。在这种情况下,用户代码将与
然后(data=>//在user.js//)中使用这里的数据正如其他两位评论者所指出的,您有一个带有回调的异步函数。解决这个问题的一种方法是在user.js文件中定义回调,并将其传递给getIG函数。所以你会 user.js 这样,异步函数在influencer内部运行,然后在结果完成时调用用户。数据现在在用户文件可利用的范围内 另一种(更好的)方法是使用承诺。在这种情况下,用户代码将与
getIg(name)。然后(data=>//在user.js//中使用此处的数据)您可以尝试将回调函数作为另一个参数传递给getIg 您的影响者文件将如下所示 您的用户文件将如下所示
使用callback将确保在调用数据之前检索数据。您可以尝试将callback函数作为另一个参数传递给getIG 您的影响者文件将如下所示 您的用户文件将如下所示
使用回调将确保在调用数据之前检索到数据。听起来像是
影响者。getIG()
是异步的,这意味着在访问影响者。数据之前,您需要回调或承诺知道何时完成。您是否可以编辑您的问题以包含影响者.getIG的代码?影响者.getIG(名称)是否异步?如果是,则可以在检索实际数据之前调用data=influencer.data。如果是这样的话,你可能不得不使用callback或promise。好的,我会用这些细节更新这个问题。不过,我确实添加了一个大的超时,以确保在让validateThis(数据)运行之前完成influencer.getIG()。但它仍然返回未定义的。原因是您无法从回调内部声明导出变量。当您调用require时,javascript自上而下执行该段代码。当您调用var influencer=require('influencer')时,它将执行influencer.js中的代码,并在第一次到达末尾时返回其中的所有内容。它不会等待回调结果。因此,回调中定义的任何内容都将始终为null。增加超时时间也无济于事。这不是比赛条件。这是因为您不能在回调中设置变量。@EugeneG这实际上是非常有意义的。非常感谢。听起来像是influencer.getIG()
是异步的,这意味着在访问influencer.data
之前,您需要一个回调或一个承诺来知道它何时完成。您是否可以编辑您的问题以包含影响者.getIG的代码?影响者.getIG(名称)是否异步?如果是,则可以在检索实际数据之前调用data=influencer.data。如果是这样的话,你可能不得不使用callback或promise。好的,我会用这些细节更新这个问题。不过,我确实添加了一个大的超时,以确保在让validateThis(数据)运行之前完成influencer.getIG()。但它仍然返回未定义的。原因是您无法从回调内部声明导出变量。当您调用require时,javascript自上而下执行该段代码。当您调用var influencer=require('influencer')时,它将执行influencer.js中的代码,并在第一次到达末尾时返回其中的所有内容。它不会等待回调结果。因此,回调中定义的任何内容都将始终为null。增加超时时间也无济于事。这不是比赛条件。这是因为您不能在回调中设置变量。@EugeneG这实际上是非常有意义的。非常感谢。这太完美了。我不太清楚为什么它会这样工作(我是回调新手),但它很神奇。addAccount的第三行到最后一行有一个额外的右括号,但除此之外,它就像一个符咒。非常感谢。谢谢@ryangineer我会尽力解释的。首先,当您在没有回调的情况下获取ig时,javascript将立即从代码中运行下一个命令,即var data=influencer.data;因为javascript不会等待像http get这样的异步操作完成。那时数据还没有到达,您还没有定义。但是,将在
module.exports = {
getIG: function (name, callback) {
var url = "https://www.instagram.com/"+name+"/?__a=1"
request({
url: url
}, callback)
}
}
module.exports = {
getIG: function (name, callback) {
var url = "https://www.instagram.com/"+name+"/?__a=1"
request({
url: url
}, callback)
}
}
addAccount: function(){
return functions.database.ref('/acct/{accountID}/name/').onCreate(event => {
var accountID = event.params.accountID;
var name = JSON.stringify(event.data.val()).replace(/['"]+/g, '');
influencer.getIG(name, function (error, response, body) {
var data = JSON.parse(body);
validate.validateThis(data);
});
});
}