9

nodejs のタイマーに関するドキュメントには、setTimeout が timeoutId http://nodejs.org/api/timers.html#timers_cleartimeout_timeoutidを返すと書かれています。

Web ブラウザで JavaScript を使用すると、戻り値として整数が返されます。

var b = setTimeout(function(){console.log("Taco Bell")})
// b = 20088

ノードを使用して同じことを行うと、戻り値は

var b = setTimeout(function(){console.log("Taco Bell")})
// { _idleTimeout: 60000,
//   _idlePrev: 
//     { _idleNext: [Circular],
//       _idlePrev: [Circular],
//       ontimeout: [Function] },
//   _idleNext: 
//     { _idleNext: [Circular],
//       _idlePrev: [Circular],
//       ontimeout: [Function] },
//   _onTimeout: [Function],
//   _idleStart: Wed Jan 30 2013 08:23:39 GMT-0800 (PST) }

私がやりたいのは、setTimeout 整数を redis に保存し、後でクリアすることです。だから私はこのようなことをしようとします

var redis = require('redis');
var redisClient = redis.createClient();
var delay = setTimeout(function(){console.log("hey")}, 20000);
var envelope  = { 'body' : 'body text', 'from' : 'test@test.com', 'to' : 'test@test.com', 'subject' : 'test subject', 'delay' : delay };
redisClient.hset("email", JSON.stringify(envelope), redis.print);

しかし、JSON.stringify から循環オブジェクトを処理できないというエラーが表示されます。setTimeout に ID を返させるか、十分な量のオブジェクトを redis に保存して後でクリアできるようにする方法はありますか?

4

3 に答える 3

1

setTimeout の呼び出しを、setTimeout の結果をオブジェクトに格納する関数にラップして、id でタイムアウトを取得できるようにします。

このようなもの:

var timeouts = {};
var counter = 0;

function setTimeoutReturnsId(callback, delay) {
  var current = counter++;
  timeouts[current] = setTimeout(function() {
      timeouts[current] = null;
      callback();
    }, delay);
  return current;
}

function getTimeoutFromId(id) {
  return timeouts[id];
}

もちろん、ノード サーバーを再起動するときは、redis をクリアする必要があります。

于 2013-01-30T20:18:42.157 に答える