9

redis db から情報を取得し、それをレスポンスの本文としてユーザーに返そうとします。まず、失敗するコードは次のとおりです。

var redis = require("redis"),
    koa = require("koa");

var app = koa(),
    port = process.argv[2] || 3000,
    client = redis.createClient();

app.use(function* (next) {

    client.get("test", function (err, res) {
        this.body = res;
    });

    yield next;
});

app.listen(port);
console.log("listen on port " + port)

確かに、コールバックが呼び出される前に yield 呼び出しが終了するためです。

次に、成功するコードを次に示します。

function askRedit (callback) {
    client.get("test", callback);
}

app.use(function* (next) {
    this.body = yield askRedit;
    yield next;
});

しかし、2番目のものが機能している理由を明確に誤解しています。の はの と同じ動作をしyieldますか?yield askRedityield next

編集:少し答えているように見えるページを見ました: https://github.com/visionmedia/co/blob/master/examples/redis.js

だから今、私はこれらの不思議な収量を理解しようとします..これは非同期呼び出しで同期的なことをする方法ですか?

4

2 に答える 2

8

正しい解決策は次のとおりです。

"Use strict";

var redis = require("redis"),
    coRedis = require("co-redis"),
    koa = require("koa");

var app = koa(),
    port = process.argv[2] || 3000,
    db  = redis.createClient(),
    dbCo = coRedis(db);

app.use(function* () {
    yield dbCo.set("test", 42);
    this.body = yield dbCo.get("test");
});


app.listen(port);
console.log("listen on port " + port)

論文のリンクが役立ちました:

https://github.com/koajs/workshop/tree/master/01-co

http://www.jongleberry.com/koa.html

そしてもちろん「co-redis」

自分のおかげです!

于 2014-08-26T08:51:27.800 に答える
0

以下を使用することもできます。

var koa = require('koa');
var app = koa();
var redis = require('then-redis');

var db = redis.createClient('tcp://redis:6379');

db.set('my-key', 0);

app.use(function *(){
    db.incrby('my-key', 5);
    this.body = yield db.get('my-key');
});

app.listen(9000);
于 2015-10-27T15:29:29.403 に答える