Tag: q

在Nodejs / Express中链接承诺的最佳实践

我知道在Nodejs / Express中链接promise的最佳方式是: doSomeThing() .then() .then() .catch(); 但最近不得不使用async和q模块遍历列表/数组并运行asynchronous函数。 我想知道是否有更好的方式来做/写这个 – var deferred = Q.defer(); var deferred2 = Q.defer(); models.Local.findOne({ where: { id: parseInt(req.body.localid) } }) .then(function(resultLocal){ if(!resultLocal){ return res.status(404).json( { "status" : "error", 'error': "Local Not Found" }); } return models.Documents.create(req.body.document); }) .then(function(docCreated){ var attributes = req.body.document.Attributes; async.each(attributes, function(item, callback) { models.Doc_Tags.create({ value: item.value, attribute_id: […]

使用Q / promise和callback

我在nodejs中使用Q库,过去没有太多的承诺,但我有半复杂的逻辑,需要大量的嵌套,并认为Q将是一个很好的解决scheme,但是我发现它似乎几乎就像“回拨地狱”一样。 基本上我已经说了5种方法,所有这些都需要上一个或之前的数据。 这是一个例子: 我们从一些二进制数据开始,基于二进制生成一个sha1哈希。 var data = { hash : "XXX" , binary: '' } 首先我们要看看我们是否已经有了这个,使用这个方法: findItemByHash(hash) 如果我们没有它,我们需要保存它,使用: saveItem(hash) 现在我们需要把这个关联到一个用户,而不仅仅是保存的结果。 现在有一个更大的层次结构,所以我们需要首先做到这一点: getItemHierarchy(item_id) ,我们使用从我们以前的saveItem返回的item_id 现在,我们可以将这些结果“复制”给用户: saveUserHierarchy(hierarchy) 现在我们已经完成了,但是,这是假设该项目还不存在。 所以我们需要处理这个项目确实存在的情况。 这将是: 我们需要检查用户是否有这样的: getUserItemByItemId(item_id) – item_id从findItemByHash返回 如果存在,我们就完成了。 如果没有: getItemHierarchy(item_id) 然后 saveUserHierarchy(hierarchy) 好的,现在我们有callback做这些检查,这很好。 但是,我们需要在每种情况下处理错误。 这也没关系,只是增加了混乱。 真的,如果stream程的任何部分抛出错误或拒绝,那么它可以停下来,只是在一个地方处理它。 现在用Q,我们可以做这样的事情: findItemByHash(hash).then(function(res) { if (!res) { return saveItem(hash).then(function(item) { return getItemHierarchy(item.id).then(function(hierarchy) { return saveUserHierarchy(hierarchy); […]

JavaScript承诺和if / else语句

当我使用filemanager函数为目录( / )代码效果很好,但是当我调用文件( /index.html )代码返回一个错误。 我发现if / else语句中的问题(即使isDir返回false , readdir也会运行),但是我不知道如何正确地将它用于promise。 var fs = require('fs'), Q = require('q'), readdir = Q.denodeify(fs.readdir), readFile = Q.denodeify(fs.readFile); function isDir(path) { return Q.nfcall(fs.stat, __dirname + path) .then(function (stats) { if (stats.isDirectory()) { return true; } else { return false; } }); } function filemanager(path) { if (isDir(path)) { return readdir(__dirname […]

使用node.js + Q延迟/承诺模块从同步callback中​​创build同步循环

stream行的JavaScript模块Q实现了延期/承诺/期货概念。 我认为它主要与node.js一起使用,但它也支持浏览器。 我使用node.js。 要做顺序调用,你使用then()把一个承诺链接到下一个,但是在一个循环中,它可能是违反直觉的,而我发现很难像这个伪代码那样做: forever { l = getline(); if (l === undefined) { break; } else { doStuff(l); } } Q文档包括一个看起来非常相似的例子: var funcs = [foo, bar, baz, qux]; var result = Q.resolve(initialVal); funcs.forEach(function (f) { result = result.then(f); }); return result; 但是,在尝试很多方法来适应这个例子,我没有成功。 与示例代码不同,我不是遍历数组,而是希望循环直到满足结束条件。 另外我总是调用相同的function。 我的函数不会将之前的结果作为下一个调用的参数。 每个调用不需要参数,但返回值决定是否继续循环。 这些看似微不足道的差异正在造成某种无法克服的心理障碍。 现在我明白了为什么许多人对理解承诺有困难。

Q.js可以使用没有node.js和要求?

我正在尝试使用最新的q.js添加承诺给我的ajax调用。 我不以任何forms或forms使用node.js。 我从https://github.com/kriskowal/q下载了最新版本,只包含q.js. 在我的控制台中,我看到了一些地方: ReferenceError:require没有定义 我不知道这是否是一个交易断路器,但我也不使用requirejs。 我正在玩一个单一的页面应用程序,而我使用jQuery的Ajax,我打算除去我的简单实现或另一个较小的图书馆的依赖。 我想使用q.js,也使用bootstrap.js,可能会使用flatiron-director,就是这样。 所以我不使用npm,或其他任何东西,因为我的应用程序是如此简单。 只有几个JS文件,我没有看到任何理由增加这种复杂性。 那么这个错误是一个问题,没有require.js(或node.js),q.js将无法正常工作? 我以为我读的是独立的,但是当我看到像这样的错误,似乎依赖于其他一些JS库,我怀疑我是否可以使用它。

在node.js中使用q时如何去除样板代码

我目前使用q与Node.js 我所有的模型都使用q的承诺。 后来我意识到写了很多这样的样板代码 count: function(){ var deferred = Q.defer() User.count(function(err,count){ if(err) deferred.reject(err) else deferred.resolve(count) }) return deferred.promise; }, findAll: function(){ var deferred = Q.defer() User.find({}, function(err,users){ if(err) deferred.reject(err) else deferred.resolve(users) }) return deferred.promise; } 有没有办法删除这个样板代码?

Q.js,promise,classes和“this”是什么意思?

我对Q诺言中的背景完全感到困惑。 我不认为这是特定的Q,而是所有的承诺一般。 this在课堂内的背景是什么? 这段代码使用TypeScript,现在一切都是静态的,因为我基本上没有做任何非静态的事情。 这段代码工作正常。 我试图添加一个private _config; 实例variables,并使用_getConfig方法在构造函数中设置_config 。 但是,当我在this._config方法中使用this._config时,它与_getConfig()方法返回的对象不是同一个对象。 (我在debugging模式下观察variables状态) 所以我猜this是在一个类里面,因为我调用Q promise的代码,没有类实例上下文。 我想知道使用promise是否是一个好主意,如果遇到上下文问题,代码将会变得更加难以理解和debugging。 我希望了解为什么,并作出select的结果。 我不想丢失类实例上下文,这太棘手了。 我害怕使用一种实际上使事情变得更加复杂的技术,我更喜欢回拨地狱 。 ///<reference path='./def/defLoader.d.ts'/> export class App { /** * Constructor. * Load the config. * @return {} */ private static _getConfig(){ if(typeof __config !== "undefined"){ return __config; }else{ require('./../../shared/lib/globals/services'); return configHelper.load('_serverConfig', require('./../../shared/config/_serverConfig.json').path.config, __dirname + '/../../'); } } /** […]

在node.js应用程序中使用q.js中的q.all实现并行asynchronous

背景介绍:我已经编写了下面的代码来指导node.js:(1)从三个文本文件中组装一个HTML页面,其中我分别存储pageheader,pagebody和pagefooter组件。 显然,这些页面片段必须按正确的顺序组装。 另一方面,没有任何要求,这些页面片段必须在它们被组装之前以任何顺序从它们的文本文件中提取出来。 我想通过实现并行的asynchronous性来利用这一点。 执行代码: var sys = require('sys'), http = require('http'), fs = require('fs'), Q = require('q'), fullpage, pageheader, pagebody, pagefooter; fullpage = ''; fs_readheader = fs.readFile('./htmlfiles.1', 'utf-8', function (err, data) { if (err) { throw err; } return pageheader = data; }); fs_readbody = fs.readFile('./htmlfiles.2', 'utf-8', function (err, data) { if (err) { […]

为什么fs.readFile返回一个缓冲区?

我已经提到这个问题了。 也就是说,我不相信我的问题在于对asynchronous的误解。 这是我的模块的相关部分。 var fs = require('fs'); var q = require('q'); var u = require('../utils/json'); var indexFile = './data/index.json'; function getIndex() { var def = q.defer(), promise = def.promise, obj; fs.readFile(indexFile, function(err,data) { if (err) { throw err; def.reject(err); } console.log('data', data); def.resolve(obj); }); return promise; } 当我login'数据',我得到一个缓冲区(下),而不是该文件的JSON内容。 <Buffer 5b 7b 22 68 65 6c […]

用Q框架和Node.js中的callback模式承诺?

即使有良好的文档化的Q框架 ,如果您使用Node.js编程几天,也是很难理解的。 但我喜欢了解它! var Q = require('q'); var fs = require('fs'); // Make the promise manually (returns a value or throws an error) var read1 = fs.readFile(fname, enc, function (err, data) { if(err) throw err; return data; }); // Convenient helper for node, equivalent to read1? var read2 = Q.nfbind(fs.readFile); // Uh?! var read3 = […]