简体   繁体   English

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

[英]Using return value in another file in Node.js synchronously

I'm concatenating tweets from a defined user through a helper file and trying to retrieve it in my server.js but there the str value is still undefined (and this line gets executed first), then the console.log from my helper prints with the right value. 我正在通过帮助程序文件连接来自已定义用户的推文,并尝试在我的server.js中检索它,但是仍然没有定义str值(并且首先执行此行),然后我的帮助程序中的console.log打印正确的价值。

Output: 输出:

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

Concatenated Tweets in Server: undefined 服务器中的串联推文:未定义

Concatenated Tweets in Helper: Test Tweet 3 #TestTweet Test Tweet 2 Test Tweet 1 帮助程序中的串联推文:测试推文3 #TestTweet测试推文2测试推文1

Can anyone help on what control flow I should use to call twitterHelper.getTweets functions to get the returned str in the server please? 任何人都可以帮助我调用twitterHelper.getTweets函数以获取服务器中返回的str的控制流吗? Thanks! 谢谢!

Server.js 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 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; 
                    }
            );

Instead of using this longway you can use this simple way by promise. 不用花那么长的时间,而是可以通过诺言使用这种简单的方法。

Helper.js 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 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);
    });
}));

I hope this will work for you. 希望这对您有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM