如何访问函数范围之外的数据?
我是一位努力学习基础知识的新编码员。为了实践,我已经构建了一个小的Node应用程序,它抓取用户时间轴上的最后一条推文并将其反转。下面的代码:如何访问函数范围之外的数据?
// REQUIRES
var dotenv = require('dotenv');
var Twitter = require('twitter');
// LOAD ENV VARIABLES
dotenv.load();
// MAKE A TWITTER CLIENT
var client = new Twitter({
consumer_key: process.env.TWITTER_CONSUMER_KEY,
consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
});
// FUNCTION TO REVERSE A STRING
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
// GRAB LAST TWEET FROM USER TIMELINE AND REVERSE IT
client.get('statuses/user_timeline', {screen_name: 'twitterapi', count: 1}, function(error, tweets, response) {
if(error) throw error;
// console.log(tweets); // Last tweet object from timeline.
var lastTweet = tweets[0].text; // Text from last tweet.
var reverseTweet = reverse(lastTweet); // Last tweet reversed.
console.log("\nYour last tweet was: " + lastTweet);
console.log("\nYour last tweet reversed is: " + reverseTweet);
});
我的问题是:如果我想通过lastTweet
或reverseTweet
到另一个功能client.get()
(例如,到另一个文本分析功能)的范围之内,我会怎么做呢?
我试过在全局声明变量,但我认为请求/响应的异步性质将其固定。我肯定愿意学习承诺,回调等(我现在明白他们对他们的看法),但我不确定这是否是解决这个特定问题的正确方法。
最后:如果我没有用正确的词汇来问正确的问题,请告诉我。
你必须在client.get函数之外声明reverseTweet或lastTweet。
你可以做到这样:
// FUNCTION TO REVERSE A STRING
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
var lastTweet = "";
var reverseTweet = "";
// GRAB LAST TWEET FROM USER TIMELINE AND REVERSE IT
client.get('statuses/user_timeline', {screen_name: 'twitterapi', count: 1}, function(error, tweets, response) {
if(error) throw error;
// console.log(tweets); // Last tweet object from timeline.
lastTweet = tweets[0].text; // Text from last tweet.
reverseTweet = reverse(lastTweet); // Last tweet reversed.
console.log("\nYour last tweet was: " + lastTweet);
console.log("\nYour last tweet reversed is: " + reverseTweet);
});
谢谢功能。我确实尝试了全局声明'var lastTweet =“”'等等,但是一直在获取空变量,例如,当我在'client.get()'函数的外部/下面调用console.log(lastTweet)时,jt只会给我空的字符串。 我在这里的早期调查表明,问题是'console.log()'超出了API res/req(争用条件?)。我_think_诺言通常用于解决这些问题,但我希望有一些更明确的功能方法来做到这一点,即在序列中运行谨慎的函数并在它们之间传递数据。 – sims226
你可以在较高的范围级别声明变量:在的事实,光
// REQUIRES
var dotenv = require('dotenv');
var Twitter = require('twitter');
var lastTweet = null;
var reverseTweet = null;
// LOAD ENV VARIABLES
dotenv.load();
...
或者可能是最好的方法,该client.get
是异步调用是将lastTweet
或reverseTweet
作为参数传递给另一个函数,并在client.get
的回调中调用该函数。例如:
// REQUIRES
var dotenv = require('dotenv');
var Twitter = require('twitter');
// LOAD ENV VARIABLES
dotenv.load();
// MAKE A TWITTER CLIENT
var client = new Twitter({
consumer_key: process.env.TWITTER_CONSUMER_KEY,
consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
});
// FUNCTION TO REVERSE A STRING
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
// GRAB LAST TWEET FROM USER TIMELINE AND REVERSE IT
client.get('statuses/user_timeline', {screen_name: 'twitterapi', count: 1}, function(error, tweets, response) {
if(error) throw error;
// console.log(tweets); // Last tweet object from timeline.
var lastTweet = tweets[0].text; // Text from last tweet.
var reverseTweet = reverse(lastTweet); // Last tweet reversed.
console.log("\nYour last tweet was: " + lastTweet);
console.log("\nYour last tweet reversed is: " + reverseTweet);
anotherFunction(lastTweet, reverseTweet);
});
function anotherFunction(lastTweet, reverseTweet)
{
// Do something with vars here
}
啊,这个是有道理的。除非绝对必要,否则我有什么希望声明全局变量是一种健康的沉默。 我打算啃一会儿。谢谢。 – sims226
这将有助于显示你想使用'lastTweet'和/或'reverseTweet'在 – mhatch