Tag: q

节点q保证recursion

我有一个asynchronous函数返回一个随机的学生。 现在我想要一个函数,返回两个独特的学生 – 我的问题的来源。 getTwoRandom = function(req) { var deferred = Q.defer(); Q.all([ Student.getRandom(req), Student.getRandom(req) ]) .then(function(students){ if(students[0]._id !== students[1]._id) { //check unique deferred.resolve(students); } else { //students are the same so try again… this breaks return getTwoRandom(req); } }); return deferred.promise; }; 然后进一步下来我有这样的事情: getTwoRandom(req).then(function(students) { //do what I want… }); 问题是我什么时候return getTwoRandom(req); .then()函数下线不会触发…这是否返回一个不同的承诺,即.then()使用?

在q-io / http.request上进行ETIMEDOUT

使用q-io / http拉入网页失败。 我想我一定会错过一些明显的东西 – 因为这是我认为是一个非常直接的例子。 编辑:Windows 8,节点11.13 var http = require('q-io/http') var url = 'http://www.google.com' ; http.request({ method: 'GET', uri: url }). then(function (response) { console.log(response) }). fail(function (err) { console.error(err) }); 这是输出: { state: 'pending' } > { [Error: connect ETIMEDOUT] stack: 'Error: connect ETIMEDOUT\n at exports._errnoException (util.js:742:11)\n at Object.afterConnect [as oncomplete] (net.js:989:19)', […]

NodeJS使用条件语句顺序asynchronous

是否有可能编写NodeJS代码,以顺序方式执行几个asynchronous步骤,其中一些步骤是基于条件语句执行还是绕过? 让我试着用伪代码写一个例子。 想象一下你有类似的东西 step1.then(step2).then(step3); 现在让我们添加一个选项: var opt = true; 怎么可能做到这样的事情: step1.then(opt && step2).then(step3); 或者,如果我们在中间说了两个不同的可能步骤: step1.then(opt ? step2 : step3).then(step4); 编辑 如果可选步骤是在开始呢? (opt && step1).then(step2).then(step3); 如果有人能够提出一些build议或提出build议,那将是非常棒的! 谢谢

链接Q.ninvoke时键入错误

当我试图使用Q连接Node.js中的mongodb函数时出现错误,如下所示: Q.ninvoke(MongoClient, 'connect', 'mongodb://127.0.0.1:27017/mydb') .then(function(db){ return Q .ninvoke(db, 'createCollection', 'mycollection') .ninvoke(db.collection('mycollection'), 'createIndex', {id: 1}) // error occurs here .ninvoke(db, 'close') .then(function(){…}) }); 我得到的错误消息: TypeError: Cannot call method 'apply' of undefined at Promise.post (/path/to/my/project/node_modules/q/q.js:1157:36) at Promise.promise.promiseDispatch (/path/to/my/project/node_modules/q/q.js:784:41) at /path/to/my/project/node_modules/q/q.js:600:44 at runSingle (/path/to/my/project/node_modules/q/q.js:133:13) at flush (/path/to/my/project/node_modules/q/q.js:121:13) at process._tickCallback (node.js:442:13) 根据这个消息,q.js中的第1157行是关于: Q.fulfill = fulfill; function fulfill(value) { return […]

node.js从url下载图片

我的问题是下载图像与未知的扩展(它可能是JPG,或PNG,或JPEG或BMP)从url。 所以我想检查图像的Content-Length,如果它大于0,则将其下载到文件,否则尝试使用另一个扩展名下载图像等。 var fs = require('fs'); var request = require('request'); var xml2js = require('xml2js'); var Q = require('q'); var baseUrl = 'http://test.com/uploads/catalog_item_image_main/'; Q.nfcall(fs.readFile, "./test.xml", "utf8") .then(parseSrting) .then(parseProductsAsync) .then(processProductsAsync) ; function parseSrting(data){ return Q.nfcall(xml2js.parseString,data); } function parseProductsAsync(xmljsonresult){ return xmljsonresult.product_list.product; } function processProductsAsync(products){ products.map(function(product){ var filename = product.sku + ""; // – where is image name filename […]

asynchronousNode.js循环中的variables范围

我想在数组上运行一些数据库查询(使用sails.js),并在查询返回时,做一些事情。 我认为最好的方法是使用for循环,并解决承诺asynchronous,一旦他们都解决了,继续下去。 然而,只有我的数组中的最后一个承诺是解决,它是解决了多次,因为在每个“User.findOne …”然后函数,索引是array.length-1。 我的问题: asynchronous循环中的variables作用域如何工作? 最好的资源来解释这个? 什么是解决我的问题的最好方法? 为什么? 还有其他的模式,我应该使用或不使用? 我对承诺和asynchronousJS相当陌生,所以任何提示都会有帮助! 主要教程我已经检查 https://github.com/kriskowal/q https://github.com/kriskowal/q/wiki/API-Reference https://github.com/bellbind/using-promise-q/ 感谢您的帮助! 我的简化代码: functionWhichReturnsPromise() .then(function(user){ var promises = []; Q.try(function(){ for (var index in array) { var fbid = array[index];// Get fbid from array promises.push(Q.defer().promise); // Add promise to promise array // Find userid from fbid; resolve respective promise when finished […]

使用Q服务来链接asynchronous事件

我了解Q服务的基础知识,但在实施时遇到困难。 我有一系列的事件,第一次依赖于第一次返回。 承诺安装 var Q = require('q'); var dataPromise = getCustomerId(); dataPromise .then(function(data) { console.log('Success!', data); getGUID(req, res, next); }, function(error) { console.log('Failure…', error); }); }; getCustomerId() var getCustomerId = function() { var getCustomerIdOptions = { options… }; var deferred = Q.defer(); request(getCustomerIdOptions, function(err,resp,body){ if(err){ deferred.reject(err); console.log(err); return; }else{ deferred.resolve(body); } return deferred.promise; }); }; […]

你如何可选地处理Javascript承诺中的错误?

我正在使用node.js中的Promises(使用Q库)。 我已经将所有基于callback的代码移植到了Promise中,而且一切都很顺利。 但是,我似乎还有一个模式,我觉得这个模式似乎在继续执行。 我觉得可能有更好的方法来处理这个问题,但我并不确定是什么。 基本上,如果你有可能从asynchronous操作中得到一个错误,你可能会也可能不能在本地处理它。 例如,处理某种types的错误,并传播其余的。 在基于callback的代码中,我会做这样的事情: fs.readFile(path, 'utf-8', function (err, data) { if(err) { if(err.code == "ENOENT") { cb(null, null); //it's fine to return null and eat the error } else { cb(err, null); //this is probably not fine, so barf } return; } … }); 在基于Promise的代码中,这变成: return fs.readFile(path, 'utf-8').then( function(data) { … }, […]

如何使用Q将事件侦听器转换为承诺

大家好,我是新来的nodejs,我试图学习承诺。 我试图实现一种菜单,将根据用户input执行某些function。 以下是我正在使用的代码: var q = require('q'); var readline = require('readline-sync'); function createNewPreset(){ var deferred = q.defer(); var preset = { "name" : undefined, "unit" : undefined, "interval" : undefined, "files" : [], } deferred.resolve(preset); return deferred.promise; } function addPreset(){ console.log("adding"); var deferred = q.defer(); createNewPreset() .then(function(){ console.log("Gettind input in addPreset"); }) .then(getUserInput) .then(function(data){ console.log("Adding […]

我怎样才能释放一个资源在一个node QS promise链中并返回一个promise?

新承诺&Q. 我想调用一个抽象底层资源的方法。 该方法将打开资源做一些处理,然后closures资源。 像这样的东西: module.exports = function fetchRecords() { return openConnection() .then(fetchRecords) .then(groupById) .catch(rethrow) .done(closeConnection); } function closeConnection(result) { releaseConnection(); return result; } 由于我打电话完成,回报不是一个承诺,而是一个未定义的。 我希望在我的客户中我可以做到: resource.fetchRecords().then(/*do something else*/); 看起来我必须将底层资源公开给客户端,以便我可以这样做: resource .openConnection() .then(resource.fetchRecords) .then(/*do something else*/) .catch(/*..*/) .end(resource.close) 我不知道Q或诺言…但我想也许有更好的办法? 我应该这样做: module.exports = function fetchRecords() { return openConnection() .then(fetchRecords) .then(groupById) .then(closeConnection) .catch(rethrow); }