2017-06-16 50 views
0

我是一位努力学习基础知识的新编码员。为了实践,我已经构建了一个小的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); 
}); 

我的问题是:如果我想通过lastTweetreverseTweet到另一个功能client.get()(例如,到另一个文本分析功能)的范围之内,我会怎么做呢?

我试过在全局声明变量,但我认为请求/响应的异步性质将其固定。我肯定愿意学习承诺,回调等(我现在明白他们对他们的看法),但我不确定这是否是解决这个特定问题的正确方法。

最后:如果我没有用正确的词汇来问正确的问题,请告诉我。

+0

这将有助于显示你想使用'lastTweet'和/或'reverseTweet'在 – mhatch

回答

0

你必须在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); 
}); 
+0

谢谢功能。我确实尝试了全局声明'var lastTweet =“”'等等,但是一直在获取空变量,例如,当我在'client.get()'函数的外部/下面调用console.log(lastTweet)时,jt只会给我空的字符串。 我在这里的早期调查表明,问题是'console.log()'超出了API res/req(争用条件?)。我_think_诺言通常用于解决这些问题,但我希望有一些更明确的功能方法来做到这一点,即在序列中运行谨慎的函数并在它们之间传递数据。 – sims226

1

你可以在较高的范围级别声明变量:在的事实,光

// REQUIRES 
var dotenv = require('dotenv'); 
var Twitter = require('twitter'); 
var lastTweet = null; 
var reverseTweet = null; 

// LOAD ENV VARIABLES 
dotenv.load(); 

... 

或者可能是最好的方法,该client.get是异步调用是将lastTweetreverseTweet作为参数传递给另一个函数,并在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 
} 
+0

啊,这个是有道理的。除非绝对必要,否则我有什么希望声明全局变量是一种健康的沉默。 我打算啃一会儿。谢谢。 – sims226