【发布时间】:2017-10-19 15:05:33
【问题描述】:
我有三个文件:user.js、influencer.js 和 validate.js
在 user.js 中,我导入 ./influencer(作为 var = 影响者)和 ./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);
});
}
通过fluencer.getIG(name),我将我们上面定义的名称传递给函数getIG(在influencer.js 内部)。这就像一个魅力。结果是 JSON 正文。
我现在要做的是获取这个 JSON 正文结果并将其传递给 validate 函数(在 validate.js 中)。在influencer.js中,我还添加了“exports.data = data;”。
话虽如此,我似乎无法弄清楚如何将“数据”传递给 validate.js。我记录它,它返回未定义。我在运行 validateThis(data) 之前添加了一个超时,但仍未定义。验证功能本身效果很好;我已经测试过了。但很明显,我这样做的方式不正确。
这是我的影响者.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;
})
}
}
如何将第二个模块的结果传递给函数中的第三个模块?我做错了什么?
【问题讨论】:
-
听起来
influencer.getIG()是异步的,这意味着您需要一个回调或一个promise 来知道它何时完成才能访问influencer.data。您可以编辑您的问题以包含influencer.getIG的代码吗? -
influencer.getIG(name) 是异步的吗?如果是,则可以在检索实际数据之前调用 data =fluencer.data 。如果是这种情况,您可能必须使用回调或承诺。
-
好的,我会用这些细节更新问题。但是,我确实添加了一个很大的超时,以确保在让 validateThis(data) 运行之前完成影响器.getIG()。不过,它仍然返回 undefined。
-
原因是您不能从回调内部声明导出变量。当你调用 require 时,javascript 从上到下执行那段代码。当你调用 varfluencer = require('influencer) 时,它会执行influencer.js 中的代码,并在第一次结束时返回其中的所有内容。它不会等待回调结果。因此,在回调中定义的任何内容都将始终为空。添加超时将无济于事。这不是比赛条件。这是因为你不能在回调中设置变量。
-
@EugeneG 这真的很有意义。谢谢!
标签: javascript node.js google-cloud-functions