Tag: q

Node.js未处理的承诺拒绝

我正在尝试使用passportloginnode.js,但是当数据库中没有的用户名尝试login时遇到问题。 我得到以下错误(node:9708) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: deferred.resolve is not a function 。 loginfunction: exports.login = function(username, password) { var deferred = Q.defer; MongoClient.connect(mongodbUrl, function(err, db) { var collection = db.collection('users'); collection.findOne({'username' : username}).then(function(result) { if (result === null) { console.log('User not found:', username); deferred.resolve(false); } else { var hash = result.password; […]

在以后的链条中使用第一个承诺的价值

我很想知道如何在Q promise中实现“链接”之间的共享价值,而不会完全亵渎承诺的美丽成语。 我使用Q在mongo数据库上做一些逻辑。 我的GET端点逻辑看起来不错: return Q.ninvoke(this.db, 'collection', 'namespace') .then(function(namespaceCollection){ return Q.ninvoke(namespaceCollection,'findOne',{"name":name}) }).then(function(queryResults){ if(!queryResults){ throw new providerErrors.NotFound(); return } return queryResults; },function(err){ throw new providerErrors.BadRequest(); });; 然而,将相同的模式应用于我的插入端点时,我遇到了一个问题。 我必须使用从第一个承诺返回的集合,即从db对象获取集合的集合,以便将值保存下来: return Q.ninvoke(this.db,'collection','namespace') .then(function(namespaceCollection){ return Q.ninvoke(namespaceCollection,findOne,{"name":namespace.name}); }) .then(function(foundNamespace){ if(namespace){ throw new providerErrors.Conflict(); return } //This is a new namespace object, give it a datetime and then //let's save it! […]

如何将对象数组映射到Q promise的数组中

我似乎无法理解这一点。 我有一个职位清单,我想把它变成一系列的承诺,然后我想收集。 它不工作,positionPromises结果为空数组(例如[null,null]) var positionPromises = _.map(positions, function(position) { var newPosition = Position({ 'weight': 1 ,'ideaId': idea.id }) var promise = null Q.all([ // asynchronous sets (each does a db lookup) newPosition.setDirectionByName(position.direction) , newPosition.setSecurityByTicker(position.ticker) ]).then(function(noop) { // the position has it's data, invoke save which also returns a promise promise = Position.qCreate(newPosition) }).done() return promise […]

是否可以在Q.All中一次性返回所有“失败”

基本上,我有一大堆我想testing网站的对象。 我正在使用下划线将URL转换为HTTP请求的承诺数组。 一旦失败,链条就结束了(我预料到了这一点)。 是否有可能收集所有失败并返回到失败function? 或者我将不得不写这个使用allSettled然后parsing? var Q = require('q') var _ = require('underscore') var JSON = require('JSON') var FS = require("q-io/fs"); var HTTP = require("q-io/http"); FS.read('members.json').then(function(memberJson){ return JSON.parse(memberJson) }).then(function(memberObjects){ var httpCheckPromises = _. chain(memberObjects). first(100). filter(function(member){ return member.website.toLowerCase().indexOf('www') >= 0 }). map(function(member){ return HTTP.read(member.website) }). value() return Q.all(httpCheckPromises) }).then(function(goodRequests){ console.log(goodRequests) }).fail(function(badRequests){ console.log('bad') console.log(badRequests) })

在下游的早期承诺中访问variables

本质上在下面的脚本中,我想知道什么URL被请求导致失败的状态。 我是否需要将其封装在一个对象中并继续传递给下游? var Q = require('q') var _ = require('underscore') var JSON = require('JSON') var FS = require("q-io/fs"); var HTTP = require("q-io/http"); FS.read('members.json').then(function(memberJson){ return JSON.parse(memberJson) }).then(function(memberObjects){ var httpCheckPromises = _.chain(memberObjects) .first(50) .filter(function(member){ return member.website.toLowerCase().indexOf('www') >= 0 }) .map(function(member){ return HTTP.read(member.website) }) .value() return Q.allSettled(httpCheckPromises) }).then(function(responses){ return _.chain(responses) .where({state:'rejected'}) .pluck('reason') .pluck('response') .value() ; }).then(function(badResponses){ return _.chain(badResponses) […]

Q承诺传播错误和例外

我正在使用这个代码,以便将一个经典的nodejs函数转换为一个promise: Object.defineProperty(Function.prototype, "toPromise", { enumerable: false, configurable: false, writable: false, value: function(self) { var $this; $this = this; return function() { var arg, args, deferred, _i, _len; deferred = Q.defer(); args = []; for (_i = 0, _len = arguments.length; _i < _len; _i++) { arg = arguments[_i]; args.push(arg); } args.push(function() { args = Array.prototype.slice.call(arguments); […]

Q.all和一系列的承诺似乎并没有工作

我试图用Q来做一些工作。 我循环并调用一个将数据保存到数据库并返回一个承诺的函数。 一旦完成,我需要做其他事情,但Q.all完成,但我可以看到每个解决scheme被调用。 我疯了,有什么想法? 设置: // save the divisions and then do the division checks // data.divisions is an array of objects var promises = []; data.divisions.forEach(function(dd){ var d = new grpl.division.Division(dd), p = d.save(); promises.push(p); }); Q.all(promises) .then(function(){ // do some other stuff here // this never actually gets called }).fail(function(err){ cb(err); }).done(); 这里是d.save() […]

在节点中使用promise来循环返回相同的响应

当使用q时,我得到相同的响应循环次数: function start() { var the_promises = []; var api_info = config.AFV var deferred = Q.defer(); var extPath = '/search/' var callType = 'GET' var mymd = buildmd5(api_info, extPath, callType); for(var page=1;page<4;page++) { console.log('getting page:'+page) new Client().get(url'+page, function(data, response){ deferred.resolve(data); }); the_promises.push(deferred.promise); } return Q.all(the_promises); } start().then(function (clips) { inspect(clips) }); 输出:resultPageNumber:['1'],resultPageNumber:['1'],resultPageNumber:['1'],resultPageNumber:['1'], 我觉得我可能有var deferred = […]

Q.all没有按照正确的顺序解决

我在Node.js中Q的承诺的执行顺序遇到问题。 该代码应该执行以下操作: a)执行一个查询并使用得到的纬度/经度对 b)计算最短path(使用asynchronous函数)和 c)返回他们 query() // Runs the query .then(function() { return computeRoutes(); // Calculates the routes }) .then(function() { return returnRoutes(); // Returns the routes as JSON }); 问题是,虽然coordinates []数组在query()中填充,并且在computeRoutes()中填充/可用,但在returnRoutes()中,routes []数组仍为空。 奇怪的是,当我不在computeRoutes()中的坐标[]上循环,而只是计算一个坐标[0]的路线,承诺链成功(但我知道只有一条路线返回为JSON) 任何想法在这里可能是错的? 谢谢!! 完整代码: app.get('/', function(req, res) { var id = parseInt(req.query.id); var radius = parseInt(req.query.radius) || 5000; var routes = []; […]

有点困惑q和nodejs承诺

我目前在nodejs中有几个js文件,它们是作为模块加载的,并且增加了app对象(使用express)。 所以他们的签名看起来像: module.exports = function(app, callback) { // … callback(); } 所以目前我有大约5个我的代码看起来像: require("./setup/a")(app, function() { require("./setup/b")(app, function(){ require("./setup/c")(app, function(){ require("./setup/d")(app, function(){ require("./setup/e")(app, function(){ startApp(); }) }) }) }) }); 现在,它看起来不好看,因为它的“厄运的金字塔”,但是我不完全确定如何改变这种模式来使用Q,因为我假设我会使用Q.fcall(…a).then(…b).etc.done() 。 然而,我不确定我是如何将应用程序传递给它的,如果我需要返回它的callback以作为承诺来处理。 理想情况下,我不想通过我的代码开始重新启动Q我只希望它在我想删除金字塔用例的地方,所以在上面的例子中,我如何使用Q来承诺将应用程序传递到每个需要的模块然后在最后启动应用程序?