Tag: 承诺

testing使用SinonJs和Mocha来限制包含Promise Code Block的Route Handler

我有一个restify行动代码块如下: function retriveAll(req, res, next) { db.user .find({where: {id: 1}) .then(function(user){ res.send(user); }) .catch(function(details){ res.send(details.message); }) .finally(function(){ next(); }); } 我想testing这个动作,具体validationres.send()在这个代码块中被调用 。 稍后validationres.send()返回的数据。 我正在使用SinonJs和Mocha进行testing框架。 以上是上述方法的示例testing代码块。 describe('retrieveAll()', function() { reqStub = {}; resStub = {send: sinon.stub()}; nextStub = sinon.stub(); beforeEach(function() { module.retrieveAll(reqStub, resStub, nextStub); }); // this doesn't work // and the sub.calledCount is 0 // […]

unit testing结束承诺链的function

假设我在一个名为UserController的类中有一个函数,它沿着这些行( userService.createUser()返回一个promise)。 function createUser(req, res) { const userInfo = req.body; userService.createUser(userInfo) .then(function(){res.json({message: "User added successfully"})}) .fail(function(error){res.send(error)}) .done(); } 我怎样才能testing,当承诺解决, res.json()被调用,当承诺拒绝, res.send(error)被调用? 我已经尝试写这样的testing: const userService = … const userController = new UserController(userService); const response = {send: sinon.stub()}; … const anError = new Error(); userService.createUser = sinon.stub().returns(Q.reject(anError)); userController.createUser(request, response); expect(response.send).to.be.calledWith(anError); 但testing失败,“response.send永远不会被调用”。 我也试过在调用res.send(error)之前logging一些东西,并且logging发生了。 我的猜测是expect()在调用res.send(error)之前被调用,因为它是asynchronous的。 我在承诺和unit testing方面还是比较新的,这是我的架构还是我对promise的使用? 我使用Q来承诺和摩卡,柴,我的unit testing。

我应该在等待事件发生时明确地创build一个承诺吗?

我正在写一个函数来获取rss订阅并返回上次更新的date: var FeedParser = require('feedparser'), Promise = require('bluebird'), request = require('request'); function getDate() { var deferred = Promise.defer(); var feed = new FeedParser(); request('rss.xml'); .on('response',function() { this.pipe(feed); }); feed.on('meta',function() { deferred.resolve(this.meta.date); }); return deferred.promise; } 这是反模式吗? 什么是正确的方法来做到这一点?

Q.all请求promise的数组,不知道如何得到结果

这可能是一个明显的答案,但我不知道要采取什么方法。 请求是一个节点模块: https : //github.com/request/request我填写getHistory请求数组(具有不同的参数)。 p = [p1,p2 …]。 this.app.all('/api/heatmap', function(req,res) { // fill p here _.each(blabla, p.push(gethistory(someparams…) var result = []; function getHistory(params) { var options = { …}; var callback = function(error, response, body) { if(error) { //wtv } else { // what to do with the body here ? return body ? […]

正确链接诺言

我想在循环内依次绑定promise。 我需要这个用户帐户,一个操作的结果取决于另一个。 我正在尝试使用绑定编写一个平面版本 – 所有代码在一个地方。 这至less是我想要的。 我用两个创build方法来包装promise,如下所示: function create(myApi, record) { return new Promise(function (resolve, reject) { myApi.create(record, function (err, result) { if (err) reject(err); else resolve(result); }); }); } function createUser(myApi, record) { return new Promise(function (resolve, reject) { myApi.createUser(record, function (err, result) { if (err) reject(err); else resolve(result); }); }); } 现在,我想创build一个循环中的用户: for […]

NodeJS:在Q中循环使用Promise

我有一个循环中的承诺问题。 整个承诺对我来说是全新的,所以我试着用非常简单的例子来学习它。 在我的例子中,我有一个服务器上的2个文本文件,我想将文本文件的内容保存到一个数组中。 它使用setTimeout,但这不是我想要的解决scheme。 这里是setTimeout的例子 var http = require('http'), Q = require('q'); var urls = ["http://localhost:8000/1.txt", "http://localhost:8000/2.txt"] var txts = []; function getData(url) { http.get(url, function(res) { var data = ""; res.on('data',function(chunk){ data+=chunk; }); res.on('end',function(){ txts.push(data); }); }).on('error',function(e){ console.log("Error Request: "+e.message); }) } function getTxts() { for(a in urls) { var url = urls[a]; getData(url); […]

如何在承诺中设置身体?

在代码中,我想以某种方式改变注释部分应该能够设置文档的身体,而不是“this.body ='test';” (它仍然应该是Promise解决scheme)。 'use strict' var app = require('koa')(), router = require('koa-router')(); router.get('/', function *(next) { this.body = 'test'; // var promise = new Promise(function(resolve, reject) { // resolve("test"); // }); // promise.then(function(res){ // this.body = res; // }) }); app .use(router.routes()) app.listen(8000); 问题在于Promise中的“this”并不是“正确的”。

使用Node-MySQL时,ES6承诺运行不正常

为什么这一系列的承诺失灵? 运行时未定义最终.then块中的“对象”对象。 new Promise(function(resolve, reject) { getConnection().query("SELECT * FROM blog", (err, rows) => { if (err) reject(err) else resolve(rows) }) }).then(rows => { let posts = [] for (let i = 0; i < rows.length; i++) { posts.push({ id: rows[i].id, … }) } return posts }).then(posts => { getConnection().query("SELECT * FROM shows", (err, rows) => […]

从KOA中间件内的承诺中调用yield

我正在编写一个KOA中间件,以便从mongo中提取用户信息,如果它没有被caching的话。 我收到以下错误: “this.getUser”函​​数返回一个ES6承诺,如果没有使用请求caching,则从mongo获取用户,或创build一个新的匿名用户。 module.exports = function* securityMiddleware(next) { this.getUser(this.request) .then((user)=>{ if(user.isAonymous){ //throw 401 access error }else{ yield next; } }); }; 这是无效的,因为:jshint说生成器必须有一个yield并抛出一个SyntaxError:意外的严格模式保留字。 你如何在KOA中间件生成器中使用promise? 我正在使用KOA v1.2.0。

以同步方式获取Javascript Promise的值

我需要以同步方式获得Javascript Promise对象的值。 我知道它是如何工作在Javascript中的Promise对象及其优点,以及如何使用then方法处理值,但是有用例,特别是Node.js(但也可以应用于浏览器引擎),在你需要的地方仅返回值,但是您调用的是返回Promise对象的API,而且不能更改该API的签名或使用者API。 例如,在Java语言中,您有get()方法,它允许您在必要时等待以完成操作(阻止执行),然后返回结果。 即使你有一个get(timeout,unit)的最大时间来等待,如果等待超时发射TimeoutException之前等待。 我遇到的问题是这样的: api1.setCallBackThatHasToReturnANoPromiseValue( function(p1, p2) { return api2.getPromisedValue(p1,p2) // This returns a Promise .get() // -> but something like this // could get the value in a sync way } ); 有人可以告诉我,如果我可以用asynchronous编程解决这个问题吗? 不pipe我的具体问题可以用asynchronous代码解决,有一种方法可以同步的方式获得Promise的价值(我知道它会阻止执行和所有的性能问题,请避免“bla bla”。 ..“ )。