srm*_*srm 6 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.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)
})
});
Run Code Online (Sandbox Code Playgroud)
运行此代码不会记录推文,也不会抛出任何错误.似乎没有任何事情发生连接,但是没有一个.then承诺起作用.
在尝试实现twit文档中的promises之前,原始代码段
var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ]
var stream = T.stream('statuses/filter', { locations: sanFrancisco })
stream.on('tweet', function (tweet) {
console.log(tweet)
})
Run Code Online (Sandbox Code Playgroud)
Jas*_*erg 12
我很遗憾地说,由于承诺和流之间的根本区别,这将无效.你说你们两个都是新人,所以让我简单介绍两者.
承诺可以被视为可能尚未到达的某些单一价值的占位符.例如,一些假设的函数getTweet()可以这样工作:
getTweet()
.then(function (tweet) {
//Do something with your tweet!
console.log(tweet);
});
Run Code Online (Sandbox Code Playgroud)
但这只会让你发一条推文!要获得另一个,你必须getTweet()再次打电话,新的.then()背后.事实上,在使用promises时,您可以保证.then()只调用一次包含函数!
流是连续的数据流.您不必手动询问推文,然后是另一个推文,然后是另一个推文.你打开水龙头,然后它就会一直持续到它完成或你告诉它停止.
因此,总而言之,您无法宣传流,因为承诺是针对连续数据流的单个值和流.
我假设您问了这个问题,因为您喜欢promise接口,并且想要使用类似于流的东西?根据您要实现的目标,有不同的库可以更好地处理流.EventStream就是一个例子.让我知道你的计划,我可以给你一个例子.