Javascript 在nodejs循环脚本中使用承诺时遇到问题

Javascript 在nodejs循环脚本中使用承诺时遇到问题,javascript,node.js,promise,Javascript,Node.js,Promise,我在节点脚本中使用for循环中的承诺时遇到了一个小问题 我首先调用twitter搜索中的数据,我想在将结果发送到应用程序前端之前将所有推文从英语翻译成法语。似乎我当前的模型没有像承诺那样工作。当触发t.get()函数时,all()console.log('all promissions DONE')正从strart启动。有什么建议吗 var Twit = require('twit') var T = new Twit({ consumer_key: '...', consumer_

我在节点脚本中使用for循环中的承诺时遇到了一个小问题

我首先调用twitter搜索中的数据,我想在将结果发送到应用程序前端之前将所有推文从英语翻译成法语。似乎我当前的模型没有像承诺那样工作。当触发t.get()函数时,all()console.log('all promissions 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);
        });
      })

    }

})
var Twit=require('Twit')
var T=新Twit({
消费者密钥:“…”,
消费者的秘密:“…”,
访问令牌:“…”,
访问令牌密钥:“…”,
timeout_ms:60*1000,//可选HTTP请求超时以应用于所有请求。
})
//推特
app.post('/twitter/search/hashtags',函数(req,res){
//TWITTER查询参数
变量参数={
q:req.body.search,
计数:2,
//朗:“fr”
}
//格达塔
var集团=[];
var承诺=[];
//TWITTER API获取信息
T.get('search/tweets',参数,函数(错误,数据,响应){
//如果没有错误
如果(!err){
//处理来自TWITTER的数据
如果(数据){
对于(变量i=0;i{
log('翻译成:');
console.log(res.text);
//情绪分析
风险值r1=情绪(res.text,'fr');
console.log(r1.score);
控制台日志(r1为正);
//如果得分为正,则向前推
如果(r1.0分>0分){
决心({
姓名:姓名,,
文本:res.text,
朗:朗,
所选:false
})
}
}).catch(错误=>{
控制台错误(err);
});
})
}
})

发生的事情很简单,T.get是一个异步函数,在完成回调时调用回调,但是
承诺。所有
部分都在函数外部,因此在调用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);
    }
});
T.get('search/tweets',参数,函数(err,data,response){
//如果没有错误
如果(!err){
//处理来自TWITTER的数据
如果(数据){
对于(变量i=0;i
您提交ajax请求,然后程序在等待时跳转到promise.all(),并进行处理,但没有承诺,因此立即执行。您需要将promise函数移到回调函数中,或者使用T.get()。然后()如下所示:

//TWITTER API获取信息
T.get('search/tweets',参数)
。然后(数据=>{
对于(变量i=0;i{
log('搜索时出错…');
控制台日志(err);
});

什么是
T
…?T是twit库。我已经用额外的信息更新了我的问题,模块说你可以同时使用cb和Promissions,但我真的不知道你为什么会…我不理解你的评论。我正在尝试等待转换api返回结果,然后再将所有数据发送到我的应用程序的前端。哦,我知道你现在做错了什么。在执行此调整时,日志“所有承诺完成”似乎没有触发事件,这意味着执行回调时出现问题;)在每个步骤中,尝试在回调或console.log中放置断点,以查看哪里出错。还要检查发送请求的响应是否有问题。我的情绪分析中有一个条件,它会阻止解决带有负面情绪的文本。我所有的推特都打了“-1”分,所以什么也没发生。没有这种情况下,一切都正常工作!答案被接受。谢谢
// TWITTER API GET INFORMATION
T.get('search/tweets', params)
.then(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);
    Promise.all(promises)
        .then(function (data) { console.log("ALL PROMISES DONE"); console.log(data);/* do stuff when success */ })
        .catch(function (err) { /* error handling */ });
}).catch(err => {
    console.log('Something went wrong while SEARCHING...');
    console.log(err);
});