Articles of 承诺

dynamic路线在科阿?

比方说,我有一个看起来像这样的路线数组: var routes = [ { route: '/', handler: function* () { this.body = yield render('home', template.home) } }, { route: '/about', handler: function* () { this.body = yield render('about', template.about) } } ]; 什么是最好的方式来app.use它们? 我尝试过这样做(用koa-route作为我的中间件): Promise.each(routes, function(r) { app.use(route.get(r.route, r.handler)); }).then(function() { app.use(function *NotFound(next) { this.status = 404; this.body = 'not found'; }); }); […]

为什么这个承诺默默地失败?

db.collection.findOne是一个asynchronous操作(MongoDB,但在这里并不重要),这就是为什么我在这里包装它的承诺。 var letsDoSomething = new Promise(function(resolve, reject){ db.collection('stackoverflow').findOne({question: true}, function(err, question){ resolve(question); // let's pretend we found a question here, and it is now resolving }) }) letsDoSomething.then(function(myData){ // it resolves console.log('foo', bar); // since 'bar' is undefined, this should fail – why doesn't it? No error messages, it goes completely silent }); 为什么当我尝试loginbar ,debugging器不会出现错误,这根本就不存在? […]

我应该在ES6节点项目中使用多less承诺?

在官方的蓝鸟承诺页面中写道,如果你使用的是node.js,那么我不太可能自己写承诺。 自从我开始一个新项目以来,我发现我所有的代码都围绕着诺言。 例如,我有一个数据库连接器,它返回一个承诺,一个承诺承诺的快速路由,testing承诺,承诺testing承诺,一般我没有写任何接收callback的函数。 我应该写callback模块,如果需要promisify他们? 有什么缺点?

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”并不是“正确的”。