Articles of 承诺

Bluebird的asynchronous承诺处理

出于某种原因,我得到了一个蓝鸟许诺,我附加处理程序asynchronous。 例如: var promise = Promise.reject(new Error('Handled rejection')); setImmediate(function () { promise.then(console.log, console.error); }); 虽然我的承诺处理得很好,但蓝鸟却警告我一个未经处理的拒绝。 我可以通过同步添加一个空的拒绝处理程序来欺骗它: promise.catch(function () {}); 但是,这看起来真的很黑。 有没有适当的方法来处理这种情况? 编辑 :在回答这个评论 ,我发布了一个更详细的例子,在这个Gist我真正的用例。 它还包含我在等待Bluebird 3.0发行版时使用的解决方法。 正如Benjamin所解释的那样,Bluebird 3.0将带来一个解决scheme.suppressUnhandledRejection() 。

什么是循环蓝鸟承诺的最佳方式

现在我正在使用NodeJS和Sequelize来查询和处理数据库数据。 我已经从Table1调用findAll,我想要查询每行应用一些数据到Table2然后我想在发送输出之前将所有数据添加到数组,我这样做 var last_promise; var output_results = {}; Table1Model.findAll() .then(function(results1) { for (var i = 0; i < results1.length; ++i) { var result1 = results1[i]; output_results[result1.id] = result1; var add_promise = Table2Model .create({ id_from_table1: result1.id, data_from_table1: result1.data }); .then(function(result2) { output_results[result2.id_from_table1].data2 = result2; }); if (last_promise) { last_promise.then(function() { return add_promise; }); } else { […]

蓝鸟承诺的functionarrays

我有一个需要从JSON文件中读取的函数数组: "functionArray" : ["task1()", "task2()", … , "taskN()"] 我的要求是顺序调用这些任务,以便只有在task1函数成功执行后调用task2函数。 将使用这些函数的包装将具有函数定义。 function task1(){ console.log('Inside task1'); } function task2(){ console.log('Inside task2'); } var functionArrayToBeUsed = readFromJson(functionArray); \\functionArrayToBeUsed has all tasks that need to be finished 什么将是一个理想的方式来做到这一点使用承诺。

如何在承诺之前添加附加逻辑

我使用下面的代码,它工作正常,现在我需要添加到它之前的readFileAsync查询Dir的另一个方法,我的问题是如何做到这一点? 这是目前正在工作的代码 var filePath = path.join(__dirname, '../userpath'); return fs.readFileAsync(filePath, 'utf8') .then(pars.getEx.bind(null, 'user')) .then(process.bind(null, 'exec')) .then(function (result) { return result.stdout; }, function (error) { return error; }); 现在我需要添加一些过程之前是这样的:现在应该返回的pathreadfileAsync(-relFilePath)我应该怎么做 var filePath = path.join(__dirname, '../../../../employess'); fs.readdir(filePath, function (err, files) { files.forEach(function (file) { if (file.indexOf('emp1') === 0) { // this should be returned var relFilePath = filePath + […]

在运行摩卡unit testing时,如何避免在NodeJScallback式API中调用两次Q promise catch块?

我们在节点API中使用Q promise库,但允许通过callback调用函数。 例如: function foo(cb) { Q.fcall(function () { return true; }).then(function (result) { return cb(null, result); }).catch(function (err) { return cb(err, null); }); } 当我运行我的摩卡单位testing时,如果在callback中有一个exception,它会导致callback被调用两次。 例如: var called = 0; foo(function (err, res) { called++; console.log('err: ' + err); console.log('res: ' + res); console.log('called: ' + called); throw Error(throw Error from foo!'); }); 这给出了以下结果: […]

答复缓慢,答复node.js

我是全新的node.js和,我觉得我做了一些不正确的事情,但我有一个更好的答案search,然后有其他语言出于某种原因。 基本上我使用一个包裹c ++插件的节点做一些工作,然后我想通过websocket发送它,然后再对其进行一些额外的parsing。 当额外的parsing是同步完成时,立即发送(如预期)。 当我在一个承诺(这是第三方模块为我所做的)承诺工作之后,调用完成的callback花费很长的时间。 喜欢5-10秒。 代码如下: var addon = require('…'); // Node wrapped C++ module … var server = http.createServer(){…}; var ios = io.listen(server); function someFunction(args) { console.log("Preparing to call some function"); someOtherFunction(args).then(funtction(val) { console.log("Sending val over websocket…."); ios.sockets.emit('thing', val); } } function someOtherFunction(args) { return new Promise(function(resolve, reject) { //logic resolve(someVal); console.log("Done with […]

使用mocha.jstestingjQyery.get不起作用,其他延迟(RSVP)

我正在尝试使用mocha.js运行一些JavaScripttesting。 到目前为止,一切工作都非常好,但是我在testingjQuery请求或其他承诺/延期方面遇到了很大的问题。 我的代码在浏览器中工作得很好,以前大量使用$.Deferred但与摩卡我不能让它运行。 我尝试了不同的方式来编写它,并切换到一个“适当的”Promise库,因为显然jQuery被认为会给它的实现带来麻烦。 正确的RSVP.Promises工作正常, RSVP.Defer还没有,我不能得到任何工作涉及jQuery(如发出请求)。 我确实发现了一些build议,将jQuery包装到适当的Promise中,应该可以做到这一点,但是找不到任何真正做到的方式,这样做不会失败。 这是一个testing用例来显示这个问题: 'use strict'; var RSVP = require('rsvp'); var $ = require('jquery'); describe('promises', function() { it('works with RSVP.Promise', function(done) { new RSVP.Promise(function(resolve, reject) { resolve(); }).then(function() { done(); }); }); it('works with RSVP.Deferred promise', function(done) { RSVP.defer().done(function() { done(); }).resolve(); }); it('works with $.Deferred', function(done) { $.Deferred().done(function() { done(); […]

使用Node.js / promisses按types捕获exception

有以下代码: router.put('/:id', function(req, res, next) { models.Task.find(req.params.id).then(function(task) { return task.updateAttributes({ title: req.body.title, description: req.body.description }); }).then(function(task) { res.json(task); }).catch(function(err) { var err = new Error('Cannot find Task'); err.status = 404; next(err); }); }); 正如你所看到的,我使用这个路由来通过id更新任务模型。 所以,现在我赶上错误,如果没有任何与id的任务,我尝试更新null对象(ReferenceError错误types)的属性。 所以,我刚刚添加validation任务模型,并有机会更新任务与空标题/说明(SequelizeValidationError错误types)。 我怎样才能在我的catch块中处理这个错误? 我想设置“无法find任务”,“无法更新任务”消息这个错误。 我应该分裂我的catch块,还是其他什么? 提前致谢!

ExpressJS Promise和EventEmitter之间明显的竞争状态

我有一个NodeJS / Expressnetworking应用程序,允许用户上传文件,然后使用Sequelize使用connect-busboy保存到我的数据库。 一旦完成,我想将用户redirect到给定页面。 但是,在我的Promise解决之前,Express已经返回了404的状态,即使我从来没有调用next() ,为了调用中间件链中的下一个处理程序,我认为这是强制性的,从而导致了404。 这是我的代码到目前为止: function uploadFormFile(req, res, next) { var documentInstanceID = req.params.documentInstanceID; // set up an object to hold my data var data = { file: null, documentDate: null, mimeType: null }; // call the busboy middleware explicitly // EDIT: this turned out to be the problem… of course this calls […]

蓝鸟模式嘲笑与syncronous代码的asynchronous承诺

我刚刚开始使用蓝鸟(和更一般的节点)。 我想创build一些模拟(最终会是http或数据库调用)。 所有关于反模式的讨论让我着急:-) 那么这是一个合理的方法将这个同步代码转换为承诺? 我在这里有两个简单的function。 第二个叫第一个(不是产品服务的方式),但它是嵌套承诺的例证。 // mock function to return a promise of a collection var getTestPatients = function(params) { return new Promise(function(resolve, reject) { setTimeout(function() {resolve(test_patients);}, 200); }) }; // mock function to return a promise of an object var getTestPatient = function(params) { return getTestPatients().then(function(patients) { // wouldnt get entire patient list […]