Javascript 当使用依赖于另一个模块输出结果的多个模块输出时,如何传递变量?

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 =

我有三个文件: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 = 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);
    });
  });
}