我需要一个由数据库查询备份的 redis 查询的异步包装器。如果 redis 查询失败,我想进行 db 查询。如果db查询成功,我想在返回前将返回的数据添加到redis中。我需要函数(希望是对象上的几个这样的方法之一)来返回一个 promise ,因为它将从 node.js 中调用。 我正在使用 bluebird promise 库,并用它来 promise redis。我正在为数据库使用 mongo-gyro,它也是基于 bluebird 的。这两个都是独立工作的。
非常感谢任何帮助 - 甚至是伪代码 - 特别是。错误处理
function get_something(key){
redis.get(key).done(function (res){
if (null !== res){
return res; // how do I return a promise here?
}
})
.done(function (res){
db.find({'_id:key'}).done(function (res){
if (null !== res){
redis.set(key,result) // set db value in redis
.then(function(){
return res; //how do I return a promise here?
})
.catch()...?
return res; // how do I return a promise here?
}
})
.catch...?
};
更新:下面的函数有效,最后显示来自 redis 或 mongo 的数据。但是 - 到目前为止,我一直没有成功将其转换为类的方法,该方法返回一个返回到 node.js 处理程序的 promise 。注意 - 我需要添加“绑定(bind)”以捕获数据源
var oid = '+++++ test oid ++++++'
var odata = {
'story': 'once upon a time'
}
var rkey = 'objects:'+ oid
redis.getAsync(rkey).bind(this).then(function(res){
if(res === null){
this.from = 'db' // we got from db
return db.findOne('objects',{'_id':oid})
}
data = JSON.parse(res)
this.from = 'redis' // we got from redis
return data
})
.then(function(res){
if(res !== null && this.from == 'db'){
data = JSON.stringify(res)
redis.setAsync(rkey,data)
}
return res
})
.then(function(res){ // at this point, res is not a promise
console.log('result from ' + this.from)
console.log(res)
});
最佳答案
.done 终止 promise 链。一般来说,Bluebird 足够聪明,可以自行计算未处理的拒绝。
它是 .then 你要找的:
redis.get(key).then(function(res){ res is redis .get response
if(res === null) throw new Error("Invalid Result for key");
return db.find({"_id":key); // had SyntaxError here, so guessing you meant this
}).then(function(res){ // res is redis .find response
return redis.set(key,result);
}).catch(function(k){ k.message === "Invalid Result for key",function(err){
// handle no key found
});
关于javascript - 我怎样才能把几个 Bluebird promise 包装在一个 promise 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375651/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您