gpt4 book ai didi

javascript - 在 Node.js 脚本 for 循环中使用 Promise 时出现问题

转载 作者:行者123 更新时间:2023-12-03 02:41:43 24 4
gpt4 key购买 nike

我在 Node 脚本的 for 循环中使用 Promise 时遇到了一个小问题

我首先从 Twitter 搜索中调用数据,我想将所有推文从英语翻译成法语,然后再将结果发送到我的应用程序的前端。看来我当前的模型无法正常工作,因为在触发 T.get() 函数时,promise.all() console.log('ALL PROMIES DONE') 会直接从 strart 触发。有什么建议吗?

var Twit = require('twit')
var T = new Twit({
consumer_key: '...',
consumer_secret: '...',
access_token: '...',
access_token_secret: '...',
timeout_ms: 60*1000, // optional HTTP request timeout to apply to all requests.
})

//TWITTER
app.post('/twitter/search/hashtags', function (req, res) {

// TWITTER QUERY PARAMS
var params = {
q: req.body.search,
count: 2,
//lang: 'fr'
}

//GData
var bloc = [];
var promises = [];

// TWITTER API GET INFORMATION
T.get('search/tweets', params, function(err, data, response) {
// if there no errors
if (!err) {
//PROCESSING DATA FROM TWITTER

if(data){

for(var i= 0; i < data.statuses.length; i++){
//translate all text string which are not in french
var lang = data.statuses[i].lang;
var str = data.statuses[i].text;
if(lang != "fr"){
promises.push(translate_str(data.statuses[i].user.screen_name, str, lang));
}
}
}
//res.send(bloc);

}
// if unable to Search a tweet
else {
console.log('Something went wrong while SEARCHING...');
console.log(err);
}
});

Promise.all(promises)
.then(function(data){ console.log("ALL PROMISES DONE"); console.log(data);/* do stuff when success */ })
.catch(function(err){ /* error handling */ });

//TRANSLATE
function translate_str(name, str, lang){
return new Promise(function(resolve, reject){
translate(str, {from: lang, to: 'fr'}).then(res => {
console.log('TRANSLATED INTO :');
console.log(res.text);

//SENTIMENT ANALYSIS
var r1 = sentiment(res.text, 'fr');
console.log(r1.score);
console.log(r1.positive);
//IF SCORE POSITIVE THEN PUSH TO FRONT
if(r1.score > 0){
resolve({
name: name,
text: res.text,
lang: lang,
selected: false
})
}
}).catch(err => {
console.error(err);
});
})

}

})

最佳答案

发生的事情很简单,T.get 是一个异步函数,在完成时调用回调,但是 Promise.all 部分位于函数外部,因此它在 T.get 之后立即调用当回调尚未被调用时 () 被触发。尝试将其移至回调内:

T.get('search/tweets', params, function(err, data, response) {
// if there no errors
if (!err) {
//PROCESSING DATA FROM TWITTER

if(data){

for(var i= 0; i < data.statuses.length; i++){
//translate all text string which are not in french
var lang = data.statuses[i].lang;
var str = data.statuses[i].text;
if(lang != "fr"){
promises.push(translate_str(data.statuses[i].user.screen_name, str, lang));
}
}
Promise.all(promises)
.then(function(data){ console.log("ALL PROMISES DONE"); console.log(data);/* do stuff when success */ })
.catch(function(err){ /* error handling */ });
}
}
//res.send(bloc);
// if unable to Search a tweet
else {
console.log('Something went wrong while SEARCHING...');
console.log(err);
}
});

关于javascript - 在 Node.js 脚本 for 循环中使用 Promise 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48302340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com