Articles of promise

Q.js:如何重写Q.js中的asynchronous系列stream?

为了掌握Q.js ,我想在Q.js使用async.series来转换下面的代码。 基本上我创build一个文件夹,如果它不存在(使用mkdirp),将文件移动到备份文件夹,并将文件保存到主文件夹。 var async = require('async'); var fs = require('fs'); var path = require('path'); var sessiondId = new Date().getTime() % 2 == 0 ? new Date().getTime().toString() : '_1234'; var backupFolder = path.join(__dirname,sessiondId); var backupFullPath = path.join(backupFolder,'a.txt'); var fullPath = path.join(__dirname,'main','a.txt'); var mkdirp = require('mkdirp'); async.series({ createOrSkip: function(callback) { mkdirp(backupFolder, function (err, dir) { if(err) […]

Q.defer()和Promise()之间的区别

我试图理解为什么下面的代码与Q.defer()和Promise() 情况1 :当我使用Q.defer() getDocument(id) .then(function (response) { console.log('in first then') return 'from two'; }).then(function (response) { console.log(response) }); var getDocument=function(){ var b = Q.defer(); b.resolve('from getDocument'); // here will do some async operation..this is just an example return b.promise; } 输出: in first then undefined 案例2 :使用Promise() getDocument(id) .then(function (response) { console.log('in first then') return […]

Promises:是.done()总是执行,即使.catch()是?

我的承诺问题 我是Promises新手,我一直在阅读Q文档 ,它说: 当你到达一个承诺链的末尾,你应该返回最后的承诺或结束链。 我已经在我的代码中定义了一个Promise Q.Promise方法,使用以下console.log来注销一个执行跟踪: function foo(){ return Q.Promise(function(resolve, reject) { doSomething() .then(function() { console.log('1'); return doSomething1(); }) .then(function() { console.log('2'); return doSomething2(); }) .then(function() { console.log('3'); return doSomething3(); }) .catch(function(err) { console.log('catch!!'); reject(err); }) .done(function() { console.log('done!!'); resolve(); }); }); } 如果每个doSomethingN()正确执行,一切都按预期工作,我得到预期的轨迹: 1 2 3 done!! 但是 ,如果任何doSomethingN()失败: foo()可以正常工作,因为错误函数callback是发生reject(err)时运行的错误函数。 foo().then(function() { /* */ […]

理解node.js中recursion函数的承诺

我试图使用recursion调用从redis中获取数据,当成员返回null时停止并返回。 所以我的数据是这样添加的: SADD parents.<name> <parent1> <parent2> SADD parents.<parent1> <grandparent1> <grandparent2> … 最终的数据应该如下所示: [ { label: <name>, parents: [ { label: <parent1>, parents: [ {label: <grandparent1>}, {label: <grandparent2> }] }, { label: <parent2> } ] } ] 这里是我搞乱的代码(来自不同来源的拼凑在一起),但我不知道我在做什么。 不知道这个代码是否有用,我可能会偏离轨道。 var redis = require('node-redis'); var r_client = redis.createClient(); var Q = require('q'); function getFromRedis(nodeName){ var ret = […]

我如何使用事件和承诺来控制程序stream?

我有一个这样的class级: import net from 'net'; import {EventEmitter} from 'events'; import Promise from 'bluebird'; class MyClass extends EventEmitter { constructor(host = 'localhost', port = 10011) { super(EventEmitter); this.host = host; this.port = port; this.socket = null; this.connect(); } connect() { this.socket = net.connect(this.port, this.host); this.socket.on('connect', this.handle.bind(this)); } handle(data) { this.socket.on('data', data => { }); } send(data) […]

nodejs redis Q promise,如何使它工作?

我正在尝试从redis获取一些值,并将它们结合起来并最终发送。 但我不能使这些承诺工作。 这是从redis get简单的function client.get('user:1:id',function(err,data){ // here I have data which contains user ID }); client.get('user:1:username',function(err,data){ // here I have data which contains username }); 现在我想获得ID和username ,并发送给他们,但我不知道如何做到这一点。 我设法使它与callback工作,但它是非常混乱的结果,所以然后我试图将匿名函数包装到Q.fcall ,然后调用。然后.then看起来像这样 client.get('user:1:id',Q.fcall(function(err,data){ return data; }).then(function(val) { // do something })); 但是这让我错误了太多的论点被传递,我甚至不知道这是否会帮助我,即使它会工作。

处理错误后跳过承诺链

使用https://github.com/kriskowal/q库,我想知道是否有可能做这样的事情: // Module A function moduleA_exportedFunction() { return promiseReturningService().then(function(serviceResults) { if (serviceResults.areGood) { // We can continue with the rest of the promise chain } else { performVerySpecificErrorHandling(); // We want to skip the rest of the promise chain } }); } // Module B moduleA_exportedFunction() .then(moduleB_function) .then(moduleB_anotherFunction) .fail(function(reason) { // Handle the reason in […]

Q Promise库的.finally()和.done()之间有什么区别?

使用Nodejs Q promise库的.finally()和.done()语句有什么区别。 例如,这两者之间的区别是什么? Q(…) .then(…) .finally(); //or fin() Q(..) .then() .done();

Mongoose和promise:如何获得一个查询结果数组?

使用mongoose从db和Q中查询promise的结果,但发现很难绕过我的头,只是得到一个可用的用户列表。 目前我有这样的一些东西: var checkForPerson = function( person ) { people = mongoose.model('Person', Person) return people.findOne({"_id": person }, function(err, doc) { if (err) console.log(err) if (doc !== null) { return doc } else { console.log('no results') } }) } var promises = someArrayOfIds.map(checkForPerson); // this is where I would like to have an array of models […]

在返回从循环中调用的数据库查询检索到的数据中的问题

我在循环中做了多个mongoDB查询。 并希望将所有结果作为一个数据数组发送。但是,当我简单地使用返回来发送数据时,它只是简单地返回undefined,不要等待所有数据库请求的结果。 我也尝试使用q.moulde,但同样的问题。 码: var getPrayerInCat = function(data){ var result ; var finalData = []; if(data.length >0){ data.forEach(function(data2){ var id= data2.id; Prayer.find({prayerCat:id},function(err,prayer){ var deferred = Q.defer() if (err) { // … console.log('An error has occurred'); // res.send(err); result= finalData = err } else { if(!prayer){ // console.log(data2.id+'–0'); data2.prayersCount = 0; result = deferred.resolve(finalData.push(data2)) } else […]