2017-06-26 88 views
-3

我想我理解的範圍和承諾/同步在這一點上,但我有一個棘手的時間弄清楚爲什麼這個塊的代碼不斷回報「未定義」當我在node.js中運行它全局變量不被數組找到?

var playerName; 
var teamName; 
var tweets = []; 

function composeTweet(){ 

    tweets = [ playerName + ' plays basketball for the ' + teamName, 
       teamName + ' want to trade for ' + playerName, 
       'what if ' + playerName + ' got traded to the ' + teamName]; 


    function getPlayer() { 
     // some code, new promise, etc ... this stuff works locally ... 
     playerName = 'Tim'; 
    } 

    function getTeam(){ 
     // code, promise ... works here also ... 
     teamName = 'Spurs'; 
    } 

    getPlayerName().then(function(){ 
     return getTeamName(); 
    }).then(function(){ 
     // sendTweet(); 
     console.log(tweets[1]); 

    }).catch(function(fromReject) { 
     console.log('error?'); 
    }); 
} 

composeTweet(); 

這應該打印:

馬刺想要交易的添

而是我得到:

不確定要爲未定義

貿易的playerName和teamName不是全局變量在這種情況呢?我誤解了如何使用承諾?如何在不使用window.playerName的情況下引用全局變量(我認爲這不適用於node.js,對嗎?)?

我大多是新編程,所以如果這是重複的道歉!非常感謝!!!

+0

該代碼沒有真正意義..你從來沒有分配任何東西給'playerName'或'teamName'(設置它們的函數永遠不會被調用),所以當然它們是未定義的。 –

+1

'tweets'中的字符串是在調用'composeTweet'函數時創建的。如果稍後更改變量值,它不會自動更新已創建的字符串。如果你想獲得變量的當前值,你必須使它們成爲函數。 – JJJ

+0

換句話說,如果你做'var a =「Hello」; var b = a +「World!」; a =「再見殘忍」;'b'的值仍然是''Hello World!「' - 承諾與它沒有任何關係。 – JJJ

回答

0

當您在設置tweets變量時,playerNameteamName值是未定義的,因爲在向它們分配任何值之前完成了值。

您必須設置tweetsplayerNameteamName具有所需的值。

關於變量範圍和承諾,代碼是好的。