Tag: 承诺

node.js〜构造Promise链式序列parsing

任何人都可以build议一个更好的方式来构build这种使用承诺? 我对Promises很陌生,在想如果我错过了一些关于如何构build这个事件链的东西。 注意:这是我的意图,不要在这里使用rej [ect]。 你看到guatanrees只有res [olve]返回。 这意味着返回的代码只需要一个path来处理返回的值。 由此返回的代码在stream程中更简单。 这可能有助于了解,如果你不认识它,这是从我创build的模块。 把它想成一个道。 module.exports = { dbConnection: function () { return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' }; }, CanIConnectToTheDB: function () { return new Promise(function (res, rej) { var sql = require('mssql'); var myDao = require('./myDao'); var cn = new sql.ConnectionPool(myDao.dbConnection()); cn.connect().then(function () { […]

如何Promisify这个function – nodejs

我有一个Ajax调用需要返回一个承诺。 function如下 client.tickets.create(ticket, function(err, req, result) { if (err) { logger.error(err); return false; } return JSON.stringify(result); }); 在执行下一个动作之前,我必须等待这个函数的执行。 我怎么能promisify这个function? 我尝试了以下,它给了我一个错误,说Cannot call method then of undefined : return client.tickets.create(ticket).then(function(result){ return JSON.stringify(result); },function(err){ logger.error(err); return false; });

如何在摩卡testing中模拟无连接

我只是想知道是否有办法在摩卡unit testing中模拟“无连接”事件。 我有一个方法,返回一个承诺,应该等待与轮询策略的互联网连接,我想用摩卡testing。 有一种方法可以实现这样的结果。 一些代码: it('should wait for connection', function(done) { this.timeout(2500); //simulate an internet connection drop here wait.connection().then(done); setTimeout(//activate connection, 2000); }); 谢谢你的回应。 [编辑]:这里有我想testing的代码: var wait = { connection: function() { 'use strict'; var settings = {retry: 1000}; return new Promise(function(resolve) { (function poll() { needle.get('https://api.ipify.org', function(error, response) { if(!error && response.statusCode === 200 […]

asynchronous/等待try / catch在处理逻辑等待解决后不显示错误

当使用try/catch进行async/await请求,并且需要对结果执行一些逻辑时,哪里是做逻辑的最佳位置? 我有这样的function function synchronousTransform (data) { return data.reduce( n => n * 2) } async function requestFn () { try { const myPromisedValue = await axios.get(url) const result = synchronousTransform(myPromisedValue.data) res.status(200).send(result) } catch (xhrError) { res.status(500).send(xhrError) } finally { console.log('done') } } 似乎在synchronousTransform中的东西不工作,我得到的错误。 不过,我在try / catch块中看到的唯一事情就像是XHR的问题。 我如何隔离synchronousTransform的function,以便我可以看到它引起的实际exception?

名称Promisevariables等于callback参数

我想知道是否可以像传递给callback的参数一样命名承诺的variables名称: var dbItems = db.find(); dbItems.then(function(dbItems) { // Do some stuff with dbItems here… }); 我认为这在语法上是正确的,但是从代码风格的angular度来看,是否有任何争论(如可能的混淆或可读性)?

为什么使用promise的asynchronousIO会生成一个零长度的文件?

任何人都可以找出这个代码有什么问题吗? 我试图写一个文件的less量字节,我得到的是一个零长度的文件没有错误报告。 我试图在node.js中使用asynchronous文件IO和bluebird promise来将一些数据写入本地文件。 我已经使用callback函数成功编写了此函数的同步版本和asynchronous版本。 但是,因为callback版本嵌套地狱,有各种各样的error handling问题,并不容易维护,我想我会尝试一个版本使用承诺,而不是因为这应该是它的长处(更好的error handling,更less的嵌套,更容易顺序asynchronous操作)。 不幸的是,承诺版本只会导致长度为零的文件。 以下是承诺版本的代码: // at initialization time var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); // code in a function var header = new Buffer('[temperatures] {"formatVersion": "1", "fields": ["t", "atticTemp", "outsideTemp"]}\r\n'); filename += ".new"; console.log("async write started"); var fd; fs.openAsync(filename, "w", 438).then(function(ffd) { fd = ffd; return fs.writeAsync(fd, […]

统一事件和承诺是JS /节点

我试图理解使用事件(即Node的EventEmitter)和承诺在同一个系统中的最佳方式。 我喜欢松散地通过某种中央事件中心进行通信的解耦组件的想法。 当一个组件有一些可能与另一个组件相关的信息时,它可以在集线器上发送它。 生成信息的组件需要对消耗信息的组件一无所知。 但有时候,交互更多的是一个请求/响应行为,而这个行为对于这个承诺看起来更加理想。 我想知道是否有办法统一这些沟通方式。 例如,我可以有一个组件,有一个encryption的消息,并需要解密。 我想要一个松散耦合的组件之间的东西与消息和组件处理消息解密。 使用promise可以为请求/响应提供良好的交互,但是代表紧密的耦合。 例如: message = … some encrypted message … decrypting_lib.decrypt(message).then(function(decrypted_message) { … do something with decrypted_message … }) 但是正如你所看到的,我通过引用解密库有一个紧密的耦合。 有了事件,我可以删除这个耦合,但代码似乎更加尴尬: message = … some encrypted message … callback = function(decrypted_message) { if( message.id != decrypted_message.id ) return; hub.removeListener('message:decrypted', callback); … do something with decrypted_message … } hub.on('message:decrypted', […]

处理承诺链中的多个捕获

我仍然是相当新的承诺,目前正在使用蓝鸟,但我有一个场景,我不太清楚如何最好地处理它。 因此,例如我有一个快速应用程序中的承诺链如下所示: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); 所以我后面的行为是: 去Id获得帐户 如果在这一点上被拒绝,就会炸毁并返回一个错误 如果没有错误,则将返回的文档转换为模型 validation数据库文档的密码 如果密码不匹配,然后炸出来,并返回一个不同的错误 如果没有错误更改密码 然后返回成功 如果还有其他问题,请退回500 所以目前的捕捉似乎并没有停止链接,这是有道理的,所以我想知道是否有一种方法让我以某种方式迫使链条停止在某个点上的错误,或者如果有更好的方法构造这个以获得某种forms的分支行为,因为存在if X do Y else Z 。 任何帮助将是伟大的。

当承诺不能传递给第三方图书馆时该怎么办?

我正在使用node.js库nomnom进行命令行parsing和bluebird的promise。 Nomnom提供通过callback来执行命令 。 不幸的是,callback不支持返回的承诺。 我想知道,处理这个接口不匹配的最好方法是什么? 我正在考虑添加一个忙碌循环,直到承诺解决/拒绝(使用isPending)在这种情况下。 有没有更好的办法 ? var parser = require("nomnom"); parser.command('somecommand').callback(function(opts) { var p = thisFuncReturnsAPromise(); //have to block here since //nomnom expects at the end of the callback that processing of the command is done. })

链接承诺与mongoose(mPromises)

我正在寻找如何链接使用nodejs / mongoose(mPromise)“fin或创build”function的承诺, 我目前尝试过: var findExistingUsername = function(value){ console.log('existusername'); return mongoose.models["User"].findOne({username: value}) .lean() .exec(); }; var findExistingEmail= function(value){ console.log('existusername'); return mongoose.models["User"].findOne({email: value}) .lean() .exec(); }; var validateEmail = function(value){ console.log('existusername'); var emailRegex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; console.log('Email valido?:' + emailRegex.test(email)); return emailRegex.test(email); }; var addUser = function(data){ console.log('existusername'); return mongoose.models["User"].create(data); }; UserSchema.methods = { validateAndAddUser: function(req, res) […]