Articles of 承诺

雷迪斯多蓝鸟承诺

你知道一个使用Redbird客户端的多重交易命令蓝鸟承诺的方法吗? 因为,下面的代码永远不会结束。 var $redis = require('redis'), $p = require('bluebird'), $r = $p.promisifyAll($redis.multi()); $r.setAsync('key', 'test') .then(function(reply, data) { // … }); $r.exec(function() { $r.quit(); process.exit(); });

顺序运行大量的承诺

一个nodejs项目。我试图用承诺顺利运行大量(大约100k)任务。 我可以做的是将其转换为一个workOnebyOne函数与Q.有没有更好的方法来做到这一点? function workOnebyOne(items, worker) { var deferred = Q.defer() function _doNext() { if (items.length === 0) { deferred.resolve() return } var item = items[0] synchronize(worker, item) .then(function (result) { items = items.slice(1) deferred.notify({ item: item, result: result }) _doNext() }, function () { items = items.slice(1) _doNext() }) } _doNext() return deferred.promise } utils.workOnebyOne(tasks, […]

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

我正试图让我的头在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 […]

Q拒绝承诺,然后成功callback

我在节点应用程序中使用kriskowal Q promise库。 我有代码读取一个文件,然后试图parsing它的一部分到一个Javascript的date对象(我有类似的代码在其他地方试图做一个JSON.parse)。 在这些情况下,我已经阅读并亲自感觉最好的做法是将代码封装在try / catch块中,以避免和潜在的致命的意外。 这里有一些真正的代码与伪代码混合在一起: var getMonitorTimestamp = function() { return readLogFile() .then( function ok(contents) { //regex to capture dates in format of: 09 Jan 2015 09:42:01 var regex = /[0-9]{2} [\w]{3} [0-9]{4} ([0-9]{2}:){2}[0-9]{2}/g; var timestamp = contents.match(regex)[0]; var date; try { date = new Date(timestamp); return date; } //when I've caught […]

等待循环完成callback

来自PHP的背景,我试图让我的头在这个callback的东西。 基本上我想获得一些行,然后我想循环这些行,并检查他们对其他模型(不同的数据库)。 我希望回拨等待,直到他们都被循环和检查。 在sequelize遍历所有结果之前调用callback函数。 基本上我想要的function是“阻止”。 我需要改变什么? toexport.getlasttransactions = function(lower,upper,callback){ var deferred = Q.defer(); var transactionsToUpdate = []; /////////////////////////// // set import conditions // /////////////////////////// var lowerbound = (lower) ? lower.format() : moment.utc().subtract(10, 'minutes').format(); var upperbound = (upper) ? upper.format() : moment.utc().format(); /////////////////////////////// // get IDs From Failed syncs // /////////////////////////////// FailedSync.find({ limit: 100 }) .then(function(res){ […]

Express.js – foreach数据数组并将其存储在数据库中

我使用expressjs,bookshelf.js,我想发布数据数组,foreach这样的数据,并保存它。 我不是很确定问题在哪里(expression式,书架或简单的旧javascript),但是这里是这样的情况:当我发布所述数组并尝试迭代它时,我得到了正确的数据保存量,但都具有数组中最后一项的值。 代码如下: router.post('/save/', function(req, res){ var data = req.body; var result = []; for (var i in data) { var d = data[i]; if (d.user_id == -1) d.user_id = null; new Term().where({'date_of_driving': d.day}) .fetch() .then(function(terms){ if (terms != null) { return new Term({'id':terms.id}).save(d).then(function(item_updated){}); } else { return new Term().save(d).then(function(item_saved){}); } }) .catch(function(error){ console.log(error); }); […]

如何尽早打破承诺链,在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) […]

node.js承诺错误的定义函数

我的问题是parsing大xml文件(与xml2js),forEach元素在周期(产品),下载图像,并将其保存到文件。 我写了这个代码: var fs = require('fs'); var request = require('request'); var parseString = require('xml2js').parseString; var baseUrl = 'http://shop.nag.ru/uploads/catalog_item_image_main/'; var async = require('async'); var processImg = require('./downloader'); var q = require('q'); var readFileSync = function (){ var xml = fs.readFileSync("./test.xml", "utf8"); return xml; }; readFileSync.then(function(xml) { parseString(xml, function (err, result) { if(err)return error; return result.product_list.product; }) […]