Javascript 使用Bluebird.js和Twitter流的承诺和流

Javascript 使用Bluebird.js和Twitter流的承诺和流,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我是Promises和Node的新手,对将Promises与流一起使用很好奇。我能保证有一条小溪吗? 使用Bluebirdjs和Twit模块,我有以下几点: var Twit = require('twit') var Promise = require("bluebird"); var T = new Twit({ consumer_key: process.env.CONSUMER_KEY, consumer_secret: process.env.CONSU

我是Promises和Node的新手,对将Promises与流一起使用很好奇。我能保证有一条小溪吗? 使用Bluebirdjs和Twit模块,我有以下几点:

var Twit = require('twit')
var Promise = require("bluebird");

var T = new Twit({
 consumer_key:         process.env.CONSUMER_KEY,
 consumer_secret:      process.env.CONSUMER_SECRET,
 access_token:         process.env.ACCESS_TOKEN,
 access_token_secret:  process.env.ACCESS_TOKEN_SECRET
})

Promise.promisifyAll(Twit);
Promise.promisifyAll(T);

var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ]

T.streamAsync('statuses/filter', { locations: sanFrancisco })
.then(function(connection){
 connection.onAsync('tweet')
  .then(function (tweet) {
   console.log(tweet)
  })
});
运行此代码不会记录tweet,也不会引发错误。什么也没发生,联系似乎建立了,但没有一个。然后承诺起作用

在尝试实现在


很抱歉,这是行不通的,因为承诺和流之间有一个根本的区别。你说你对这两个都不熟悉,所以让我给你简单介绍一下

承诺可以被看作是某些可能尚未到达的单个值的占位符。例如,一些假设的函数
getTweet()
可以这样工作:

getTweet()
    .then(function (tweet) {
        //Do something with your tweet!
        console.log(tweet);
    });
但这只会给你一条推特!要获得另一个,您必须再次调用
getTweet()
,后面是一个新的
。然后()
。事实上,在使用Promissions时,您可以保证
.then()
只调用其包含函数一次

流是连续的数据流。您不必手动请求一条推文,然后再请求另一条,然后再请求另一条。你打开水龙头,然后它就一直来,直到它结束或者你叫它停下来

因此,总而言之,您不能承诺流,因为承诺是针对单个值的,而承诺是针对连续数据流的

我假设您问这个问题是因为您喜欢promise接口,并且希望对streams使用类似的东西?根据您试图实现的目标,有不同的库可以让您更好地使用流。这是一个例子。让我知道你的计划,我也许能给你举个例子

我能保证有一条小溪吗

不会。当一个流不断地发出事件时,承诺只解析一次。它们具有完全不同的语义(即使两者都使用异步回调)

您可以为结束的流做出承诺,请参见-但这不是您的twitter流示例所做的

运行此代码不会记录tweet,也不会引发错误

因为
T.stream()
是一个返回流对象的同步工厂函数。您不需要—您不能—使用
streamAsync
,因为它永远不会调用隐式传递的回调。

我最终使用实现Observable with


我最终不得不使用RX.Observable.fromEvent而不是RX.Node.fromStream,因为Twit模块必须在幕后处理实际流,但通过和EventEmitter将其公开,他们可能不应该将其命名为t.stream。

我认为您不应该使用promisified事件侦听器。虽然我可能错了,但我从来没有见过这样使用它。看一看(但这只对结束的流有意义)。看看它们为流建模的可观察对象-例如RxJS和BaconJS。谢谢!我确实喜欢promise界面。我做这个练习主要是为了了解承诺以及何时应该使用和何时不应该使用。我正慢慢地试图离开地狱,进入承诺的美丽世界。很好地解释了流与承诺。把事情联系起来。
getTweet()
    .then(function (tweet) {
        //Do something with your tweet!
        console.log(tweet);
    });
var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ]

var stream = T.stream('statuses/filter', { locations: sanFrancisco });

var source =  Rx.Node.fromEvent(stream, 'tweet');

var observer = Rx.Observer.create(
    function (tweet) {
        // THIS IS WHERE EACH TWEET SHOULD COME FROM THE STREAM
        console.log(tweet);
    },
    function (err) {
        console.log('Error getting tweets: ' + err);
    },
    function () {
        console.log('Completed');
    }
);

source.subscribe(observer);