javascript - Node.js 如何使用回调将数据发送到 Web 界面

标签 javascript node.js callback

我有两个查询 twitter api 的函数。查询是通过网络界面完成的,当复选框打开时我调用每个函数。我现在的问题是在完成所有查询后,我希望能够存储数据并将其发送回网络界面。我该怎么做?

    if (string.checktweet1 == 'on') {
      tweets(string.teamname)
    }
    if (string.checkmentions1 == 'on'){
      mentions(string.teamname)
    }
    if (string.checktweet2 == 'on'){
      tweets(string.playername)
    }

    if (string.checkmentions2 == 'on'){
      mentions(string.playername)
    }
<小时/>
      function mentions(x){
         client.get('search/tweets', {q:x, count:1},
         function (err,data,){
            for(var index in data.statuses){
               var tweet = data.statuses[index];
               console.log(tweet.text);
            }
       })
     }

我的代码仅发送“tweets”功能的数据

      json = {};
     function tweets(y){
       client.get('statuses/user_timeline', {screen_name:y, count:1},
       function(err,data) {
         for(var index in data){
           var tweet = data[index];
           console.log(tweet.text);
         }
          json[index] = tweet
          res.end(JSON.stringify(json));
      })
    }

最佳答案

据我了解,您并不希望保存数据,而只是收集多个异步调用的结果,并在所有完成后将数据传递给您的客户端?如果是这样,您可以使用 asyncpromises .

Stack Overflow 中已经有这样的例子,例如。这个Node.js: Best way to perform multiple async operations, then do something else?但无论如何,这里都简化了两者的实现。

使用异步

var async = require('async');

// ...

var tweets = function(y) {
  return function(cb) {
    client.get('statuses/user_timeline', {screen_name: y, count: 1},
      function(err, data) {
        // Process the data ...
        cb(null, processedTweets);
      }
    );
  }
};

var mentions = function(x) {
  return function(cb) {
    client.get('search/tweets', {q: x , count: 1}, 
      function(err, data) {
        // Process the data ...
        cb(null, processedMentions);
      }
    );
  }
};

app.get('/mytweetsapi', function(req, res) {
  var tasks = [];
  if (string.checktweet1 == 'on') {
    tasks.push(tweets(string.teamname));
  }
  if (string.checkmentions1 == 'on'){
    tasks.push(mentions(string.teamname));
  }
  if (string.checktweet2 == 'on'){
    tasks.put(tweets(string.playername));
  }
  if (string.checkmentions2 == 'on'){
    tasks.put(mentions(string.playername));
  }

  async.parallel(tasks, function(err, results) {
    // Process the results array ...
    res.json(processedResults);
  });
});

使用 promise

var Promise = require('bluebird');

// ...

var tweets = function(y) {
  return new Promise(function(resolve, reject) {
    client.get('statuses/user_timeline', {screen_name: y, count: 1},
      function(err, data) {
        // Process the data ...
        resolve(processedTweets);
      }
    );
  });
};

var mentions = function(x) {
  return new Promise(function(resolve, reject) {
    client.get('search/tweets', {q: x , count: 1}, 
      function(err, data) {
        // Process the data ...
        resolve(processedMentions);
      }
    );
  });
};

app.get('/mytweetsapi', function(req, res) {
  var tasks = [];
  // Same if this then tasks.push as in async example here

  Promse.all(tasks).then(function(results) {
    // Process the results array ...
    res.json(processedResults);
  });
});

我不知道您使用的是什么 HTTP 客户端,但您也许可以使用 var client = Promise.promisifyAll(require('your-client-lib'));将方法转换为返回 promise ,然后您可以将 tweets 转换为和mentions功能

var tweets = function(y) {
  return client.get('statuses/user_timeline', {screen_name: y, count: 1});
};

这样虽然 resultsPromise.all是混合响应,您需要确定哪些是 tweets分别是mentions正确处理它们。

关于javascript - Node.js 如何使用回调将数据发送到 Web 界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408974/

相关文章:

javascript - JavaScript 中的回调问题

JavaScript:回调访问另一个参数

javascript - 如何对每秒帧数进行编程

javascript - CSS、HTML 和 Javascript : "loading..." spinner doesn't work with link onClick

node.js - 使用email-template-v2 Nodejs动态内容不显示

node.js - npm 脚本部分 "clean:dist"与 "clean"

node.js - AWS S3 使用 docker 容器解析 URI 错误

javascript - 基于 .obj 模型的颜色

javascript - 从javascript中的文档中删除表单元素

c++ - 让 C 回调调用 C++ 成员函数的最佳方法?