Articles of q

什么是明确的承诺build设反模式,我如何避免它?

我正在编写的代码看起来像这样: function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) { /* .fail */ | […]

节点kriskowal / q承诺链接承诺上的堆栈错误

下面的代码错误出在第一个.then上: /Users/danielbyrne/working/mite_npm/mite.js:48 .then(configMan.validateSettings(parsedData)) ReferenceError: parsedData is not defined 我不明白为什么这个代码是失败的。 电话: parseConfigurationFile(path.join(__dirname,'file.config')) .then(validateSettings(parsedData)); 它所调用的function: function parseConfigurationFile(fileName) { var readFile = q.nfbind(fs.readFile); readFile(fileName,"utf-8") .then(function(data) { var deferred = q.defer(); // Return the Config 'settings' in JSON deferred.resolve(JSON.parse(data)); return deferred.promise; }); } function vaidateSettings (data) {…} 这个工作的唯一方法是如果我将函数validateSettings更改为匿名函数,并像这样内联: parseConfigurationFile(path.join(__dirname,'file.config')) .then(function(parsedData){…}); 为什么我不能以这种方式链接命名函数?

如何将此node.async代码转换为使用q? 我需要退还一个承诺吗?

在我的控制器内的“视图”方法以前使用node-async但我想尝试使用q 。 我目前正试图将其转换 exports.view = function (req, res) { var category = req.params.category, id = req.params.id, ip = req.connection.remoteAddress, slug = req.params.slug, submission, userId = typeof req.session.user !== 'undefined' && req.session.user.id ? req.session.user.id : null, views; var getSubmission = function (submissionId, callback) { Submission.getSubmission({ id: submissionId }, function (err, submission) { if (err) { callback(err); […]

node.js如何在从stream中导入数据库后同步最终callback

这听起来像一个非常典型的用例如Q或async库,但我真的不知道什么是最好的方式来做到这一点。 我想用150行(使用node-csv )导入CSV文件,并为每行创build一个mongo文档。 然而,streamparsing看起来比“db插入”更快,所以我遇到了callback被调用得太早的问题。 // importtest.mocha.js […] importer.loadFromCsv (url, function(result) { result.length.should.be.equal (150); // nope, it's always around 41 } // importer.js function loadFromCsv (url, callback){ csv().from.stream(url) .on ('record', function(record, index){ new Row({data: record}).save(function() { console.log ('saved a row to db'); }); }) .on ('end', function() { callback (Row.find({})); // E parser finished, but probably […]

承诺返回值和嵌套

我有一个函数createOne()应该试图find一个MongoDB文档或创build它,如果找不到。 无论哪种方式,都应该返回一个承诺,并用doc解决承诺: var createOne = function(category) { var self = this; return this.findOne({ slug: category.slug }).exec() .then(function(doc) { if (!doc) { return self.create(category); // wait to resolve until document created. } }); }; findOne().exec()和create() (应该)都返回一个promise。 我尝试了很多不同的方法,比如使用Q.fcall,用Q.defer()和其他方法手动创build一个,但是parsing值丢失,或者创build了第二个{ slug: 'foo' } ,即使首先已经存在(?)。 以下是我的通话代码: var data = [ { slug: 'foo' }, { slug: 'bar' }, { slug: […]

使用Q承诺 – 有没有办法让这个代码重复性较低?

我正在为我的Node.js应用程序启动一个集成testing套件。 我目前正在尝试编写一个设置脚本来擦除testing数据库,并用一些testing数据填充它。 我试图避免可怕的“厄运金字塔” ,我希望使用承诺作为防止我的代码失控的一种方式。 我对承诺很陌生,我仍然试图把自己的头围绕在他们身上 – 可能我没有正确使用它们。 这是我没有承诺的最初版本。 这工作,但嵌套callback了wazoo: var mongoose = require('mongoose'); var User = require('./user'); var MONGODB_URL = process.env.MONGODB_TEST_URL || 'localhost:27017/swot_test'; console.log('\nRunning e2e test preparation script'); console.log('———————————–\n'); console.log('Connecting to database:', MONGODB_URL, '…') mongoose.connect(MONGODB_URL, function () { console.log('Wiping database…') mongoose.connection.db.dropDatabase(function () { console.log('Setting up test user…') User.createUser({ email: 'test@example.com', password: 'tester' }, function (err, […]

node.js推迟了误解

我正在学习q.js并试图同时查询3个集合(避免callback地狱): var Q = require('q') var deferred = Q.defer(); users()是db.collection.find()的包装器 var users = function (){ Auth.listUsers({role:'user'}, call) return deferred.promise } call()是导出promise的简写 var call = function (err,data){ if (err) { deferred.reject(err); } else { deferred.resolve(data); } } loop()是主循环,它获取游标并循环通过条目 var loop = function (result) { var list = [] var promises = []; result.each(function (err,data){ if (err) […]

Node.js承诺Q.all不起作用

我有这个readLines函数来逐行parsing,调用从: var fs = require('fs'); var Q = require('q'); Q.all(readLines(fs.createReadStream("/tmp/test.txt"), console.log)).then(function () { console.log('Done'); }; function readLines(input, func) { var remaining = ''; input.on('data', function (data) { remaining += data; var index = remaining.indexOf('\n'); while (index > -1) { var line = remaining.substring(0, index); remaining = remaining.substring(index + 1); func(line); index = remaining.indexOf('\n'); } }); […]

许多排队操作的Q模式

我正在为node.js编写一个小脚本,从文件中读取一堆图像名称(2.5k),调整图像大小并将其输出到目录。 我天真的方式导致用完文件句柄: //get the list of images, one per line in the file var imgs = file.split('\n'); //keep track of how many images we've processed var done = imgs.length; var deferred = Q.defer(); for (var i = 0; i < imgs.length; i++) { (function resizeImg(img) { //open the file for writing the resized image to […]

Q诺从未引用过

Kris Kowal的Q文档指出, Q.onerror是在未处理的exception时调用的。 我不能使它工作: var Q = require('q'); Q.longStackSupport = true; var util = require('util'); Q.onerror=function(){ console.log('Q.onerror::') console.log(util.inspect(arguments)) } function get(){ var def=Q.defer(); def.resolve('resolved'); return def.promise; } get() .then(function(val){ console.log('ok:'+val) undefined._prop; // i would expect this exception to be // forwarded to Q.onerror… but it doesn't console.log('not reachd') }); 输出: ok:resolved 我想我不太了解Q.onerror的使用我想跟踪一个不错的堆栈跟踪未处理的exception(也可能是拒绝)