Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我怎样才能把几个蓝鸟的承诺包装成一个承诺?_Javascript_Redis_Promise_Bluebird - Fatal编程技术网

Javascript 我怎样才能把几个蓝鸟的承诺包装成一个承诺?

Javascript 我怎样才能把几个蓝鸟的承诺包装成一个承诺?,javascript,redis,promise,bluebird,Javascript,Redis,Promise,Bluebird,我需要一个由db查询备份的redis查询的异步包装器。如果redis查询失败,我想进行db查询。如果db查询成功,我想在返回之前将返回的数据添加到redis。我需要函数(希望是对象上的几种方法之一)来返回承诺,因为它将从node.js中调用。 我正在使用蓝鸟承诺库,并用它来承诺redis。我使用mongo陀螺仪作为db,它也是基于蓝鸟的。这两种方法都是独立工作的 非常感谢您的帮助,即使是伪代码,尤其是在错误处理方面 function get_something(key){ redis.get(k

我需要一个由db查询备份的redis查询的异步包装器。如果redis查询失败,我想进行db查询。如果db查询成功,我想在返回之前将返回的数据添加到redis。我需要函数(希望是对象上的几种方法之一)来返回承诺,因为它将从node.js中调用。 我正在使用蓝鸟承诺库,并用它来承诺redis。我使用mongo陀螺仪作为db,它也是基于蓝鸟的。这两种方法都是独立工作的

非常感谢您的帮助,即使是伪代码,尤其是在错误处理方面

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处理程序的承诺。注意-我需要添加“绑定”,以便捕获数据源

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
终止承诺链。一般来说,蓝鸟足够聪明,能够自己处理未处理的拒绝

它是
。然后
您正在寻找:

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
});

Ideotype,从我对您的原始问题和更新的理解来看,我相信您可以实现您的目标,而不需要一个标志来跟踪哪个来源产生了所需的数据

像这样的方法应该会奏效:

function get_something(oid) {
    var rkey = 'objects:' + oid;
    return redis.getAsync(rkey).then(function(res_r) {
        if (res_r === null) {
            return Promise.cast(db.findOne('objects', {'_id': oid})).then(function(res_db) {
                redis.setAsync(rkey, res_db).fail(function() {
                    console.error('Failed to save ' + rkey + ' to redis');
                });
                return res_db;
            });
        }
        return res_r;
    }).then(function (res) {//res here is the result delivered by either redis.getAsync() or db.find()
        if (res === null) {
            throw ('No value for: ' + rkey);
        }
        return res;
    });
}
注:

  • 您可能需要使用
    oid
    rkey
    修复行。我在这里的理解是有限的
  • 这里的模式是不寻常的,因为mongo gyro查询是可选的,随后的redis更新是关于函数整体成功的学术性更新
  • 根据
    db.findOne()
    返回的内容,可能不需要使用
    Promise.cast()
    包装器
  • 这无疑将得益于对蓝鸟有更好了解的人的一次重温

嗨,本杰明,你确定这件事吗?@Roamer-1888我从来都不确定我什么时候回答了一个不是100%清楚的问题。然而,我也犯了一些错误,你指的是哪一部分?嗨,本杰明-这很有帮助,但实际上并没有回答我的具体问题。我现在有了需要使用的功能,mongo支持redis。我仍然需要弄清楚如何将函数(如您的示例中)转换为类上的方法。我会看看是否可以发布我的工作,部分解决方案Benjamin,最糟糕的部分是SyntaxError,但是(承诺)即使
redis.set()
失败,也可能返回结果
redis.set()
是一项副业活动。虽然我不是一个真正喜欢蓝鸟的人,但我会亲自尝试回答这个问题。谢谢@Roamer-1888关于Promise.cast的提示-更多c/leaner代码。“oid”和“rkey”只是应用程序中实际键的占位符。