【问题标题】:Trouble using promises in nodejs script for loop在nodejs脚本for循环中使用promise时遇到问题
【发布时间】:2018-01-17 13:29:23
【问题描述】:

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

我首先从 twitter 搜索中调用数据,我想将所有推文从英语翻译成法语,然后将结果发送到我的应用程序的前端。似乎我当前的模型无法正常工作,因为 promises.all() console.log('ALL PROMISES DONE') 在触发 T.get() 函数时从一开始就触发了。有什么建议吗?

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 ...?
  • T 是 twit 库。我用额外的信息更新了我的问题
  • 那个模块说你可以同时使用cb和promise,但我真的不知道你为什么会......
  • 我不明白你的评论。我正在尝试等待翻译 api 返回结果,然后再将所有数据发送到我的应用程序的前端。
  • 哦,我知道你现在做错了什么

标签: javascript node.js promise


【解决方案1】:

发生的事情只是 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);
    }
});

【讨论】:

  • 执行此调整时似乎未触发日志“ALL PROMISES DONE”事件
  • 这意味着执行回调时出现问题;) 尝试在每一步都在回调或 console.log 中放置断点,看看哪里出错了。还要检查发送请求的响应是什么
  • 我的错,我的情绪分析中有一个条件阻止解析带有负面情绪的文本。我所有的推文都被评分为“-1”,所以什么都没有发生。如果没有这种情况,一切都会正常工作!答案接受。谢谢!
【解决方案2】:

您提交 ajax 请求,然后您的程序在等待它时跳转到 promise.all() 并处理但没有任何 promise,因此它会立即发生。您需要在回调中移动您的承诺函数或使用 T.get().then() 像这样:

// 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);
});

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2019-02-02
    • 2020-12-18
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多