Articles of 承诺

在promisifyAll创build的then-chain链中使用cancel()

不知道我是否足够清楚这个标题,但假设我有一个名为Foo的类与方法1,方法2和方法method3 。 我promisifyAll与promisifyAll方法。 然后,我有一个时间链,我想在第二个或第一个中间取消操作,那么不应该再叫。 我读了取消( http://bluebirdjs.com/docs/api/cancellation.html ),但我不知道如何与promisifyAll实施。 我得到的代码加上我所需要的: var bluebird = require('bluebird'); function Foo() { } Foo.prototype.method1 = function (cb) {}; Foo.prototype.method2 = function (cb) {}; Foo.prototype.method3 = function (cb) {}; var foo = bluebird.promisifyAll(new Foo()); foo.method1Async() .then(function (r1) { // cancel then-chain res.json("Task stopped"); // just stop right here promises.cancel(); }) .then(function (r2) { […]

如何发送承诺的对象数组

我已经尝试了很多,没有得到任何对我有用的东西。 我试着用promise.all和全局设置数组,但没有成功。 我想在MongoDB的三个集合中search,当查找匹配时,用信息设置一个对象并推送到一个数组。 最后,用objects数组发送一个响应。 router.post('/certificado', (req, res) => { let cpf = splita(req.body.cpf) let array = [] function pesquisaProjeto(cpf) { return new Promise(function (fulfill, reject) { ProjetoSchema.find({'integrantes.cpf':cpf}, 'integrantes.$ nomeProjeto -_id',(err, usr) => { if (err) return reject(err) fulfill(usr) }); }) } function pesquisaAvaliador(cpf) { return new Promise(function (fulfill, reject) { avaliadorSchema.find({'cpf':cpf}, 'nome -_id',(err, usr) => […]

然后用Javascript使用外部variables

我是新来的JavaScript,大多花了我的时间编写后端Java程序。 我无法弄清楚如何在调用时捕获范围variables的当前状态,例如: – idList = [0, 1, 2, 3, 4, 5]; for(id in idList) { new Promise(function(resolve, reject) { // A mock async action using setTimeout setTimeout(function() { resolve(10); }, 300); }).then(function(num) { console.log(id + ': ' + num); return num * 2; }); } 输出是: – "5: 10" "5: 10" "5: 10" "5: 10" […]

迭代昂贵的asynchronous函数 – 内存约束,recursion?

我有一些问题,我认为是在node.JS服务器端应用程序中使用Promise的一个基本问题 – 不幸的是我看不到如何解决它,尽pipe看到其他类似的问题(我认为)。 基本上我的问题是这样的:我试图检索一些外部数据,然后处理它。 有很多数据,所以我必须逐页检索它。 另外考虑到数据的大小,我的服务器不能一次执行多个调用/进程,因为内存不足和服务器崩溃。 我不知道,直到执行时间,我必须检索多less页来获取所有的数据。 我已经尝试执行一个forEach循环与数组的页数然而,这显然不工作。 例如: pages = [1,2,3,4]; pages.forEach( function(pageNumber){ veryMemoryExpensiveFunctionRetrievingAndProcessingPage(pageNumber).then( // handle the results); }) (这里的行为是所有函数都是同步执行的而服务器内存不足)。 我很困在这里 – 我知道我需要同步多次执行该function,但不知道从哪里开始这样做! 我也试图recursion,但是这又一次导致内存不足,因为每个调用都添加到堆栈中。

如何捕获数组中的所有promise都被parsing的事件?

我正在使用Bluebird库与NodeJS(与SailsJS框架) Promise.all()在promises数组中的所有promises均被parsing时不捕获事件。 为了解决这个问题应该做些什么改变? var Promise = require("bluebird"); var request = require('request'); var http = require('http'); function searchMultiple(titles) { var results = []; return new Promise( function( resolveGlobal, rejectGlobal ){ var url = "http://xxx.xxx"; var promises = []; titles.forEach(function (title, index) { promises[index] = new Promise( function (resolve, reject) { var data = {"x":title}; request({ uri: […]

节点; Q承诺延期

以下是一些简单的问题,这些问题基于我在下面的节点中运行的示例中的行为: Q('THING 1').then(console.log.bind(console)); console.log('THING 2'); 这个输出是: > "THING 2" > "THING 1" 问题: 1)为什么Q在执行callback之前等待立即知道的值? 为什么Q不够聪明,让第一行在第二行之前同步发出输出? 2)输出"THING 2"和"THING 1"之间的时间差是多less? 这是一个单一的过程? 3)对承诺中包含的价值观是否会有性能问题? 例如, Q(Q(Q("THING 1")))asynchronous地等待3倍的时间来完成,即使它可以被有效地同步解决?

为什么Promise在Node.js中返回(parsing)一个空对象?

我最近在执行node.js文件时遇到了问题。 我将发布代码并解释问题所在。 我有2个文件,即testit.js和test.js 在test.js中,我使用module.exports将包含文本文件的文件path的数组对象传递给testit.js ["a.txt","b.txt"] 在testit.js中,module.exports.text接受文件名的数组对象, 通过Object.keys(texts).forEach处理每个Object.keys(texts).forEach , 通过readFile读取每个返回的缓冲区值, 通过takeAction返回包含在该缓冲区中的文本 并将其存储在数组对象newtexts 。 但是,当newtexts被parsing并且调用返回到then(),其中newtexts被打印在命令行上时,它将返回一个EMPTY ARRAY OBJECT而不是返回每个文件的文件内容的数组对象。 有人可以解释我在代码中出错的地方吗? 预先感谢一吨。 test.js var testit = require('./testit'); var texts = ["a.txt","b.txt"]; testit.text(texts).then(function(newtexts){ console.log(newtexts); }); testit.js var Promise = require('bluebird'); var S = require('string'); var fs = require("fs"); module.exports.text = function(text){ var texts = text; var length = Object.keys(texts).length; return new […]

find大量的文件,并获得节点FS的总数

我build立一个节点脚本asynchronous输出一个目录的文件数和行数; 但是,我在其asynchronous控制stream程中遇到麻烦。 // Import Dependencies const fs = require('fs'); const get_dir_line_count = (dir) => { let output = { file_count: 0, file_line: 0, path: '' }; new Promise( (resolve, reject) => { fs.readdir(dir, (err, dir_contents) => { resolve(dir_contents); }); }).then( (promise_contents) => { Promise.all(promise_contents.map( (file) => { const file_path = dir + '/' + file; […]

TypeError:无法设置未定义的属性'_bitField'(蓝鸟库)

我正在使用蓝鸟2.x. 我打电话给包裹在诺言中的卡夫卡。 如果消息已发布,则承诺将被解决。 如果对卡夫卡的呼叫失败,那么这个promis就会被拒绝。 这是导致错误的一段代码 – redis.get(something) .then(function() { return Promise(function(resolve, reject) { // This is Line 98 in the stacktrace producer.send([ { topic : "Ganga", messages : [JSON.stringify({// some object})] } ], function(err, data) { if(err) { logger.error("Error") logger.error(err); reject(err); return; } resolve(data); }) }); }) 堆栈跟踪如下 TypeError: Cannot set property '_bitField' of undefined […]

使用router.js中的promise来模拟error handling

我正在尝试将传感器值保存到我的mongodb数据库。 我正在使用承诺做适当的error handling。 我正在使用then()和catch()但我想我没有做正确的。 我发送一个组ID,以便检查组ID是否存在,然后只存储传感器信息。 这是我的代码。 router.post('/data/:group_id', function(req,res,next){ var group_id = req.params.group_id; User.find({group_id : group_id}).then(function(user){ var object_id = user[0]._id; var datas = req.body; var data = new Data({ user : object_id, value: datas.value, valueString : datas.valueString, sensorStatus : datas.sensorStatus, timeStamp : new Date().toJSON() }); data.save().then(function(data){ res.send('Data Saved'); }); }).catch(function(e){ if(e.code === undefined){ res.send('Group id does […]