在 Node.js 的另一个文件中同步使用 return 值

Using return value in another file in Node.js synchronously

我正在通过帮助文件连接来自已定义用户的推文,并尝试在我的 server.js 中检索它,但是 str 值仍然未定义(并且该行首先执行),然后 console.log 从我的助手打印出正确的值。

输出:

GET /login/twitter/callback 302 618.242 ms - 0

Concatenated Tweets in Server: undefined

Concatenated Tweets in Helper: Test Tweet 3 #TestTweet Test Tweet 2 Test Tweet 1

任何人都可以帮助我应该使用什么控制流来调用 twitterHelper.getTweets 函数来获取服务器中返回的 str 吗?谢谢!

Server.js

app.get('/login/twitter/callback', 
    passport.authenticate('twitter', {failureRedirect: "/login"},
        function(req, res) { 
            // auth success 
            async.waterfall ([
                function(callback) {
                    callback(null, twitterHelper.getTweets(user)); 
                },
                function(str, callback) {
                    console.log("Concatenated Tweets in Server: " + str);
                    callback(null);
                }
                ], 
                function(err) {
                    if(err)
                        console.log("Error: " + err);                   
                }
            );  
        }
    )
);

Helper.js

var concatTweets = '';
var promise = new Promise( 
                function(resolve, reject) {
                    T.get('statuses/user_timeline', params, function( err, data, response) {
                        if(err) 
                            reject(err); 
                        else {
                            for (var i = 0; i < data.length ; i++) 
                                concatTweets = concatTweets + " " + data[i].text; 
                            resolve(concatTweets);  
                        }   
                    })
                }
            ).then( 
                    str => {
                        console.log("Concatenated Tweets in Helper: " + str);
                        return str; 
                    }, err => {
                        console.log(err);
                        return err; 
                    }
            );

您可以承诺使用这种简单的方式,而不是使用这种长途方式。

Helper.js

var concatTweets = '';
var getTweets = function(user){
    var promise = new Promise(function(resolve, reject) {
        T.get('statuses/user_timeline', params, function( err, data, response) {
            if(err){
                reject(err);    
            } else {
                for (var i = 0; i < data.length ; i++) 
                    concatTweets = concatTweets + " " + data[i].text; 
                console.log("Concatenated Tweets in Helper: " + concatTweets);
                resolve(concatTweets);  
            }
        })
    });
    return promise; 
}

Server.js

app.get('/login/twitter/callback', passport.authenticate('twitter', {failureRedirect: "/login"},function(req, res) { 
    // auth success 
    twitterHelper.getTweets(user).then(str=>{
        console.log("Concatenated Tweets in Server: " + str);
    }).catch(err=>{
        console.log("Error: " + err);
    });
}));

我希望这对你有用。