Articles of 诺言

如何在每次迭代调用asynchronous选项时等待forEach完成?

好的,这是计划。 浏览每个文件,将文件添加到数组中。 一旦添加完所有文件,然后使用JSZipUtility和Docxtemplater进行合并: 'click .merge-icon': (e) => { var programId = Router.current().url.split('/').pop(); var programObj = Programs.findOne(programId); var insertedDocuments = []; var i = 0; var count = programObj.activityIds.count; var fileDownloadPromise = new Promise((resolve, reject) => { programObj.activityIds.forEach(function(activityId) { var activityObj = Activities.findOne(activityId); var documentObj = ActivityFiles.findOne(activityObj.documents.pop()._id); JSZipUtils.getBinaryContent(documentObj.url(), callback); function callback(error, content) { var zip = […]

不能调用Parse.Promise._continueWhile

我已经尝试了有条件的承诺循环如下,但它从来没有进入第二个function。 我没有search,但还没有解决。 请给我一些关于这个的想法。 谢谢 P / S:这个api来自parseplatform.org的JS的api Parse.Promise._continueWhile( function() { query.find().then( function( results ) { queryResults = results; logger.log('info', 'I can enter this function'); return queryResults.length != 0; }); }, function() { logger.log('info', 'Cannot enter this function'); var a = new Parse.Promise(); a.resolve(); return a; });

我怎样才能改善这个嵌套的asynchronous循环?

问题如下。 我有这样的对象数组: let myObj = [ {'db1':['doc1','doc2','doc3']}, {'db2':['doc4','doc5']}, {'db3':['doc7','doc8','doc9','doc10']} ] 请注意,这是我决定用于解决问题的数据结构,如果可以改进整体实施,则可以对其进行更改。 实际的数据库和文档ID是从格式如下的文本文件中读取的。 "db1","doc1" "db1","doc2" … 我的应用程序将同步遍历数据库列表。 在每个数据库迭代中,将会有一个文档列表的asynchronous迭代。 每个文件将被检索,处理并保存回数据库。 所以基本上在任何给定的实例:一个分贝,但多个文件。 我有一个像上面这样的工作实现: dbIterator :迭代dbs的同步外部循环。 传递给docIterator的callback将触发下一次迭代。 const dbIterator = function (x) { if (x < myObj.length) { let dbObj = myObj[x]; let dbId = Object.keys(dbObj)[0]; docIterator(dbId, dbObj[dbId], ()=>merchantIterator(x+1)); } else { logger.info('All dbs processed'); } }; docIterator :迭代文档的asynchronous循环。 […]

无法将值从服务返回到控制器以在node.js中进行呈现

我最近开始使用nodejs,因为我想转到一个新的项目(我通常是一个Java程序员)。 我正在做一个rest服务API。 到目前为止,我已经有一个路由模块,它定义了我的端点,然后调用一个控制器函数,它保留了我的对象,然后返回响应。 我想委托我的持久性逻辑到一个服务模块,以保持我的控制器。 对于我更复杂的情况来说,这是绝对必要的。 我正在努力寻找如何成功地重构我的代码来使用服务。 我到目前为止还没有成功地调用一个服务方法,从我的控制器返回一个值,然后渲染。 我将提供我正在工作的原始模块,然后尝试将逻辑拉出到返回值的服务模块中: 路线/ index.js const UserController = require('../controllers/userController'); const ProfileController = require('../controllers/profileController'); module.exports = (app) => { app.get('/api', (req, res) => res.status(200).send({ message: 'Welcome to the Todos API!', })); app.get('/api/users', UserController.list); app.post('/api/users', UserController.create); app.get('/api/users/1/profile', function() { console.log('got profile for user 1'); }); app.post('/api/users/1/profile', ProfileController.create); }; 车型/ user.js的 'use strict'; […]

承诺承诺太多的错误?

我在文档中写下这种风格的承诺: Q.fcall(promisedStep1) .then(promisedStep2) .then(promisedStep3) .then(promisedStep4) .then(function (value4) { // Do something with value4 }) .catch(function (error) { // Handle any error from all above steps }) .done(); catch子句将会发现包括拼写错误在内的任何错误。 但是,根据nodejs dos: 由于JavaScript在JavaScript中的工作原理,几乎没有任何方法可以安全地“捡起你离开的地方”,而不会泄漏引用或创build其他某种不明确的状态。 应对抛出的错误的最安全的方法是closures该过程。 如果我们在callback风格中编写代码,而不是承诺风格,则会抛出一些types的错误 这真让我困惑。 在诺言书写时,我应该如何避免泄漏的引用。 谢谢〜

平行mongoose与promises /蓝鸟查询?

我有一个使用mongoose的nodejs / mongodb项目,还有蓝鸟的承诺。 这是我的问题:我有一个函数,有时需要执行1个查询,有时2个并行查询,然后join两个查询的结果。 这里是一个伪代码(因为我使用咖啡文本,但是这是不相关的): function(param) { // 1st query query1.exec // 2nd query, should be done in parallel with the 1st if (param) query2.exec // process requiring result from both queries callback() } 我知道如何执行asynchronous并行任务,但我不明白如何执行与蓝鸟或mongoose承诺。 谢谢,

抛出Mongoose pre中间件的自定义错误,并使用蓝鸟承诺

我用蓝鸟承诺使用mongoose。 我正在尝试在validation前中间件中抛出一个自定义错误,并使其捕捉到Bluebird catch。 这是我的validation方法 schema.pre('validate', function(next) { var self = this; if (self.isNew) { if (self.isModified('email')) { // Check if email address on new User is a duplicate checkForDuplicate(self, next); } } }); function checkForDuplicate(model, cb) { User.where({email: model.email}).count(function(err, count) { if (err) return cb(err); // If one is found, throw an error if (count […]

node.js承诺:如何找出哪个迭代抛出.catch语句中的exception?

(这不是JavaScript内部循环的重复- 简单实用的例子,因为你不能selectcatch函数采用哪些参数) 我不熟悉Node.js的asynchronouscallback性质 我试图找出for循环中的哪个元素抛出exception。 当前的代码总是返回数组中的最后一个元素,而不pipe哪个元素抛出exception。 for (i = 0; i < output.length; i++) { var entity = Structure.model(entity_type)[1].forge(); /* do some stuff here which I've taken out to simplify */ entity.save() .then(function(entity) { console.log('We have saved the entity'); console.log(entity); returnObj.import_count++; }) .catch(function(error) { console.log('There was an error: ' + error); console.log('value of entity: ', entity); […]

拒绝承诺没有达到捕获

我试图使用这种方法非顺序诺言输出。 express .json调用成功地从API发送了一个201到用户对象,但是在控制台中,我得到如下所示的未处理拒绝错误。 这似乎应该被控制器中的.catch处理程序捕获。 我想知道为什么会发生这种情况? UserController的 module.exports.postUser = function (req, res, next) { var user = req.body.user; var ip = req.ip; userService.createUser(user, ip) .then(function (user) { res.status(201).json({"user": user.toJSON()}); }) .catch(function (err) { return next(err); }); }; userService module.exports.createUser = function (user, ip) { var user = new Promise(function (resolve, reject) { return resolve(User.forge(user)); }); return […]

testing一个消费诺言的函数

我有一个平均的应用程序,我试图让testing工作在节点端。 asynchronous事件封装在控制器中使用的promise中。 我在testing控制器:( 我试图testing的控制器: ProjectController.prototype.getAll = function(req, res, next) { req.dic.subjectRepository .getById(req.params.subjectId) .then(function(subject) { res.json(subject.projects); }, function(err) { return res.status(404).send('Subject does not exist.' + err); }); }; subjectRepository是我们的数据源,它返回一个promise( mpromise因为我们正在使用mongoose ,但不应该): 所以在我们的testing中,我们试着嘲笑请求(我们正在从一个中间件注入我们的dependency injection容器到req )和响应(如果response.json()已经被我们试图获取的主题调用,testing成功)和我们的subjectRepository。 我们使用bluebird (虽然我尝试了其他人的挫折)为我们的subjectRepository创build假承诺: describe('SubjectController', function() { 'use strict'; var Promise = require('bluebird'); it('gets all existing subjects', function() { // ————————————- // subjectRepository Mock […]