Tag: 蓝鸟

为什么随之而来的链式承诺解决了?

我正试图让我的头在Promises / A +的位置,而且我对两个点感到困惑。 考虑一下: function foo() { console.log("In 'foo' function: –> which returns a Promise"); return new Promise(function (resolve, reject) { resolve() }); } var promise1 = foo(); var promise2 = promise1.then(function () { console.log("Promise 1 has been resolved –> onFulfilled() returns a value"); return 1; }); var promise3 = promise2.then(function () { console.log("Promise […]

如何尽早打破承诺链,在Express中发送错误?

我有这个请求处理程序,它看起来像这样: router.post('/', function(req,res) { var screencast; var channel; youtube.get(req.body.videoId).then(function(data) { screencast = data.screencast; channel = data.channel; }).then(function() { return connection.beginTransactionAsync(); }).then(function() { return connection.queryAsync('INSERT IGNORE INTO Channels SET ?', channel); }).then(function() { return connection.queryAsync('INSERT INTO Screencasts SET ?', screencast) }).then(function() { return connection.commit(); }).error(function(e) { connection.rollback(); }); }); 有时我想尽早打破承诺链,并发出错误。 这是我试过的: router.post('/', function(req,res) { var screencast; […]

Bluebird可以在node.js中使用redis吗?

这里是我原来的代码来获取存储在redis中的用户php会话: var session_obj; var key = socket.request.headers.cookie.session session.get('PHPREDIS_SESSION:'+key,function(err,data){ if( err ) { return console.error(err); } if ( !data === false) { session_obj = PHPUnserialize.unserializeSession(data); } /* … other functions … */ }) 我想用Promise重写代码,但是我不能得到返回的data : Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(data){ return data; }).then(function(session){ console.log(session); // this returns true, but not the session data session_obj = PHPUnserialize.unserializeSession(session); }).catch(function(err){ console.log(err); }) session返回布尔值true而不是会话数据。 […]

链接asynchronous函数Node.js bluebird mongoskin

我一直在阅读很多关于如何链接asynchronous函数的文章,但我似乎无法做到这一点! 正如标题所示。 我试图将mongoskin数据库调用链接在一起,以便我可以将所有信息以块的forms收集,然后最终将响应中的累积结果发送出去。 我有这样的对象用户: var User = { username: 'someusername', accounts: [{name: 'account_1'}, {name: 'account_2'}] } 对于每个帐户,我需要收集数据,然后在响应中发送累积的数据。 所以我使用以下for循环遍历帐户: var promise = require('bluebird'); var db = require('mongoskin').db('mongodb://localhost/someDB'); for(var x in user.accounts){ //Fetch account data user.accounts[x].accountData = fetchAccountData(user.accounts[x].name); } //Finally send the collected response response.send(user); 而fetchAccountData函数如下所示: function fetchAccountData(screen_id){ db.collection('master') .aggregate([ {$match: {screen_id: screen_id}} ], function(err, res){ if(err) […]

Promise.map在继续执行.then()之前不等待parsing。

我试图把自己的想法包括在JavaScript的承诺之中, 这是我最近的挫折感: var rp = require('request-promise'); function process1000() { //gets 1000 objects from DB to process get1000objects() .then(function (docs) { Promise.map(docs, addApiData) }) .then(function (objects) { console.log(objects) }) } function addApiData(element) { return rp(url).then(function (res) { resolve(res); }) .catch(console.error); } 当在addApiData()中调用rp(url)时,它不会等待函数parsing,然后再开始传递给process1000()中的Promise.map数组中的下一个项目。 只要在addApiData中调用rp(url),就会在数组中的下一个项目上调用addApiData。 然后在process1000中的第二个.then()函数被提前调用,所有事情都有机会在Promise.map中parsing。 我已经尝试了几个不同的库来使我的GET请求,但他们都有这个相同的问题。 我在这里做错了什么? 任何帮助将不胜感激。

我应该在等待事件发生时明确地创build一个承诺吗?

我正在写一个函数来获取rss订阅并返回上次更新的date: var FeedParser = require('feedparser'), Promise = require('bluebird'), request = require('request'); function getDate() { var deferred = Promise.defer(); var feed = new FeedParser(); request('rss.xml'); .on('response',function() { this.pipe(feed); }); feed.on('meta',function() { deferred.resolve(this.meta.date); }); return deferred.promise; } 这是反模式吗? 什么是正确的方法来做到这一点?

节点JS – 处理多个查询(承诺,蓝鸟)

我很好,如果新的Node JS(我使用MongoDB,Express和Mongoose),我有以下问题: 有一个包含10个地址标识的数组,我需要在做其他事情之前检查所有地址是否在数据库中。 我知道mongoose使asynchronous查询,我试图使用蓝鸟( https://www.npmjs.com/package/bluebird )作出承诺,但仍然没有运气: 这里有一些尝试: 1 var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = undefined; idsArray.forEach(function(id){ Address.count({_id: id}, function(err, count){ //count is 0 if id does not exist if(err || !count){ reject(false); } }); resolve(true); }); } } 第2 var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = […]

如何在Javascript中支持2种types的callback

在intercom-client github中,我看到了这个代码: client.users.list(function (d) { // d is the response from the server }); // Or client.users.list(function (err, d) { // err is an error response object, or null // d is a successful response object, or null }); 我的问题是:如何通过funcrtion(err,d)或只是function(data)知道intercom 。 我检查了源代码,发现他们使用bluebird库。 蓝鸟如何做呢? 我希望我的function也能做到这一点。 换一种说法: function myFunction(data,callback){ if (callbackListenToErrArgument(callback)) callback(null,data) else callback(data) } 如何实现callbackListenToErrArgument函数?

承诺结合stream

我想逐行阅读大文件并将数据插入到数据库存储中。 我functon返回一个Promise内部创buildstream,并解决它时,事件stream.on('end')被调用,但它不是我真的想要,因为在stream.on('data')它产生Promise.map() ,并且我想确定在resolve()调用之前完成的所有插入操作。 在这种情况下我怎样才能产生正确的链条? var loadFromFile = (options) => new Promise(function (resolve, reject) { let stream = fs.createReadStream(options.filePath, { flags: 'r', }); stream.on('data', (chunk) => { /* process data chunk to string Array */ Promise.map(lines, (line) => { /* process and insert each line here */ }) .catch((err)=>{ reject(err); }); }); stream.on('end', () => { […]

承诺改变for循环的全局variables

我正在尝试做一些JavaScript代码的不同风格的基准testing,这里是我有: var Promise = require('bluebird'); var timer = function(name) { var start = new Date(); return { stop: function() { var end = new Date(); var time = end.getTime() – start.getTime(); console.log('Function:', name, 'finished in', time, 'ms'); } }; }; function regular (a, cb) { if (a % 2 === 0) return cb(null, a); return […]