2017-06-16 1 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); 
}); 

私の質問です:私はそのclient.get()の範囲外の別の関数にlastTweetreverseTweetを渡したい場合(例えば、別のテキスト解析関数に)、私はそれをどのように行うのでしょうか?

私は変数をグローバルに宣言しようとしましたが、リクエスト/レスポンスの非同期性が原因です。私は間違いなく約束やコールバックなどについて学びたいと思っています(私は今、彼らについてzilchを理解しています)が、この特定の問題を解決する正しい方法かどうかは分かりません。

最後に、適切な質問に適切な語彙を使用していない場合は、教えてください。

+0

それはあなたが 'lastTweet'および/または' reverseTweet'を使用したい機能を表示するために役立つだろう – mhatch

答えて

0

reverseTweetまたはlastTweetをclient.get関数の外で宣言する必要があります。

あなたがそのように行うことができます:client.getであるという事実に照らして

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

// LOAD ENV VARIABLES 
dotenv.load(); 

... 

それとも、おそらく最良の方法:

// 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)私に空の文字列を与えるだけです。 私の初期の調査では、 'console.log()'がAPI res/req(競合状態?)を上回っているということが示唆されています。私はこれらの問題を解決するためによく使われる約束事をしていますが、これを行うためのより明示的な機能的な方法があることを期待していました。 – sims226

1

をあなたが高いスコープレベルで変数を宣言することができ非同期呼び出しでは、他の関数に引数として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 
} 
+0

ああ、これは理にかなっています。私は、絶対に必要でない限り、グローバル変数を宣言するための虚栄心です。 私はしばらくそれをやっつきます。ありがとうございました。 – sims226

関連する問題