gpt4 book ai didi

design-patterns - Redis、node.js 和 Javascript 回调范围/流程

转载 作者:搜寻专家 更新时间:2023-11-01 00:15:53 28 4
gpt4 key购买 nike

最近我一直在更深入地探索 javascript,玩弄 Node 、redis、socket.io、express simple webapp。

我想我遇到了一个问题,它是 JS 和 PHP 之间根本区别的一个例子,这也是我过去几年一直在使用的东西。

我写了这个回调,需要从redis返回一堆数据

app.get('/deck', function(request, response) { 
dealer.sort('cards', 'BY', 'deal:*->timestamp', 'GET', 'card:*->card_key',
function(err, card_keys) {
var deck = [];
for (k in card_keys) {
dealer.hget(card_keys[k], 'data', function(err, card_data) {
var deal = eval('(' + card_data +')');
deals.push(cards);
});
}
response.json(deals);
}
);
});

现在我首先认为这是一个变量范围问题,所以我用一个闭包重写了(我是否正确使用了这个术语?)这没有用,因为我是在同步思维模式下写的。我意识到这本质上是同步的,并在收集数据之前将其发送出去。设计错误。

我可以重写该函数以使用 socket.io 的 emit 函数来发送收集到的数据。

但是有处理同步数据的设计模式吗?如果我想按顺序显示最后 10 张牌怎么办?我是否无论如何都发送数据并让客户端代码排队 10,并触发一个排序然后控制显示的事件?

编辑:我找到了 this question这基本上是我的,除了我想弄清楚如何在不依赖同步库的情况下设计它。

最佳答案

function(err, card_keys) {
var deck = [];
for (k in card_keys) {
// whole bunch of async actions
dealer.hget(card_keys[k], 'data', function(err, card_data) {
var deal = eval('(' + card_data + ')');
deals.push(cards);
});
}
// sync action
response.json(deals);
}

您已经知道 response.jsonhget 完成之前触发。

答案是引用计数

function(err, card_keys) {
var deck = [];
var count = Object.keys(card_keys).length;

function next() {
if (--count === 0) {
response.json(deals.sort(sortThem));
}
}

for (k in card_keys) {
dealer.hget(card_keys[k], 'data', function(err, card_data) {
var deal = JSON.parse(card_data);
deals.push(cards);
next();
});
}
}

你还有另外两个小问题

  • 使用 eval 代替 JSON.parse
  • 您的交易数组是无序的,因为 hget 是异步的,所以您需要一个排序函数。

关于design-patterns - Redis、node.js 和 Javascript 回调范围/流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com