2017-10-19 91 views
0

我有三個文件:user.js的,influencer.js,& validate.js如何在使用多個依賴於另一個模塊結果的模塊導出時傳遞變量?

在user.js的,我進口./influencer(如VAR =影響者)& ./validate(如VAR =有效)。

我在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); 
}); 
} 

隨着influencer.getIG(名字),我傳遞我們上面的功能getIG(influencer.js內)定義的名稱。這像一個魅力。結果是JSON正文。

我現在要做的就是取得這個JSON正文結果並將它傳遞給validate函數(在validate.js中)。在influencer.js中,我還添加了「exports.data = data;」。

這樣說,我似乎無法弄清楚如何將「data」傳遞給validate.js。我將它記錄下來,並返回undefined。我在運行validateThis(data)之前添加了一個超時,但仍未定義。驗證功能本身非常有效;我測試過了。但顯然,我不是這樣做的正確方法。

這是我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; 
    }) 
} 
} 

我怎樣才能通過第二模塊在我的函數的第三個模塊的結果呢?我究竟做錯了什麼?

+0

聽起來像'influencer.getIG()'是異步的,這意味着你需要一個回調或者一個承諾來知道它何時完成,然後你就可以訪問'influencer.data'。你能編輯你的問題來包含'influencer.getIG'的代碼嗎? –

+0

是influencer.getIG(名稱)異步嗎?如果是,則可以在檢索實際數據之前調用data = influencer.data。如果是這樣的話,你可能不得不使用回調或承諾。 –

+0

好的,我會用這些細節更新問題。然而,我確實添加了一個很大的超時,以確保在讓validateThis(data)運行之前影響器.getIG()會完成。但它仍然返回undefined。 – ryangineer

回答

1

您可以嘗試通過回調函數

influencer.getIg(名稱)。然後的線(此處數據=> //使用數據user.js的//)作爲另一個參數來獲取您的影響者文件將看起來像這樣。

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); 
    }); 
    }); 
} 

使用回調將確保你怎麼稱呼它之前檢索數據。

+0

這很完美。我不太清楚爲什麼它的工作方式完全正確(我是新來的回調),但它是驚人的。你在addAccount的倒數第三行有一個額外的右括號,但否則,它就像一個魅力。謝謝! – ryangineer

+0

謝謝@ryangineer我會盡我所能解釋它。首先,當你的getIG沒有回調的時候,你的代碼會立即運行下面的命令var data = influencer.data;因爲JavaScript不會像http一樣完成異步操作。那時數據還沒有到達,你得到了不確定。然而,在異步操作完成並且數據已經到達後,將會調用回調函數,以確保您可以接收數據(如果有)。 –

1

正如另外兩位評論員指出的那樣 - 您有一個帶回調的異步函數。解決這個問題的方法之一是在user.js文件中定義回調,並將其傳遞給getIG函數。所以,你將有

user.js的

<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.js

module.exports = { 
getIG: function (name, callback) { 
var url = "https://www.instagram.com/"+name+"/?__a=1" 
request({ 
url: url 
}, callback) 
} 
} 

這樣的異步函數運行影響力之內r,然後在結果完成時回撥給用戶。數據現在處於用戶文件要使用的範圍內。

另一種更好的方法是使用承諾。在這種情況下,用戶代碼將沿着

相關問題