异步 redis 和承诺

Posted

技术标签:

【中文标题】异步 redis 和承诺【英文标题】:Async redis & promise 【发布时间】:2018-07-01 03:29:30 【问题描述】:

我有一个场景,我必须运行一个循环,每次迭代都调用 redis 设置函数(异步),然后我必须关闭与 redis 的连接。

顺序...

    运行 foreach 循环。 对于每个元素,使用 redis set 命令。 循环完成后,关闭redis连接。

现在 redis 连接在 for 循环内完成所有设置操作之前关闭。


更多细节...

我正在使用node.js redis client。 我知道为什么会发生这种情况,但我不确定如何解决这种情况。 我是 NodeJS 的新手。

【问题讨论】:

【参考方案1】:

您无需破解结构 - node.js client 支持开箱即用的技术。查看Multi.exec

命令在Multi 对象中排队,直到Multi.exec()

// iterate and construct array of set commands
let commands = items.map(i => ['set', i.key, i.value]);

client
  .multi(commands)
  .exec((err, replies) => 
    // disconnect here
  );

如果您实际上不需要事务,您可以通过client.batch 一次性批处理所有命令。然后,您当然可以相应地围绕此模式组织您的连接和断开策略。

【讨论】:

【参考方案2】:

你可以使用 asyncLoop 来解决这种类型的问题,它在类似的情况下帮助了我很多:-

var asyncLoop = require('node-async-loop');
asyncLoop(arr, function (item, next)
  // foreach loop on the array "arr"
  //the each element is "item"
  //call next when the iteration is done

 //execute redis command on "item" and then do
 next();

, function(err)
  if(err==null)

//do something on loop complete like closing connection etc
);

这是你可以做你想做的事情的基本方式,你可以不喜欢这样的异步循环:-

npm install --save node-async-loop

【讨论】:

【参考方案3】:

首先你创建一个 promise 数组,然后使用 Promise.all 例如:

function connectPromise (paramers) 
  return new Promise((resolve, reject) => 
    // if connectToRedisAndSetFunc is a promise
    // conectToRedisAndSetFunc(params).then(data => 
    //  resolve(data)
    //).catch(err => 
    //  reject(err)
    // )
    conectToRedisAndSetFunc(params, function(err, data) 
      if (err) 
       reject(err)
       else 
       resolve(data)
      
    )
  )

// create promiseArray
let connectsPromises = params-array.map(p => connectPromise(p))

Promise.All(connectsPromises).then(data => 
  // close redis here
).catch(err => 
  console.log(err)
)

【讨论】:

conectToRedisAndSetFunc 是 redis API 未承诺的回调。 redisConnection.set(key, value, function(err, resp) if (err) console.log(err) else console.log(resp) ); 谢谢!这就是我一直在寻找的。这解决了我的问题。 @ShashankSachan 我真的很惊讶你选择这个作为你接受的答案。为什么你不想像我建议的那样使用 API 来做这件事?

以上是关于异步 redis 和承诺的主要内容,如果未能解决你的问题,请参考以下文章

对异步和承诺的困惑。反应原生

Javascript - 异步等待和获取 - 返回值,而不是承诺?

nodejs 中的异步和 Q 承诺

javascript 承诺和异步等待

javascript 回调,承诺和异步/等待

javascript 承诺和异步等待