소스 검색

Finish Observable.debounce;

bjorn 9 년 전
부모
커밋
92556b4925
2개의 변경된 파일18개의 추가작업 그리고 10개의 파일을 삭제
  1. 9 5
      rx.lua
  2. 9 5
      src/operators/debounce.lua

+ 9 - 5
rx.lua

@@ -608,18 +608,19 @@ function Observable:debounce(time, scheduler)
   time = time or 0
   time = time or 0
 
 
   return Observable.create(function(observer)
   return Observable.create(function(observer)
+    local debounced = {}
+
     local function wrap(key)
     local function wrap(key)
-      local debounced
       return function(...)
       return function(...)
         local value = util.pack(...)
         local value = util.pack(...)
 
 
-        if debounced then
-          debounced:unsubscribe()
+        if debounced[key] then
+          debounced[key]:unsubscribe()
         end
         end
 
 
         local values = util.pack(...)
         local values = util.pack(...)
 
 
-        debounced = scheduler:schedule(function()
+        debounced[key] = scheduler:schedule(function()
           return observer[key](observer, util.unpack(values))
           return observer[key](observer, util.unpack(values))
         end, time)
         end, time)
       end
       end
@@ -628,7 +629,10 @@ function Observable:debounce(time, scheduler)
     local subscription = self:subscribe(wrap('onNext'), wrap('onError'), wrap('onCompleted'))
     local subscription = self:subscribe(wrap('onNext'), wrap('onError'), wrap('onCompleted'))
 
 
     return Subscription.create(function()
     return Subscription.create(function()
-
+      if subscription then subscription:unsubscribe() end
+      for _, timeout in pairs(debounced) do
+        timeout:unsubscribe()
+      end
     end)
     end)
   end)
   end)
 end
 end

+ 9 - 5
src/operators/debounce.lua

@@ -6,18 +6,19 @@ function Observable:debounce(time, scheduler)
   time = time or 0
   time = time or 0
 
 
   return Observable.create(function(observer)
   return Observable.create(function(observer)
+    local debounced = {}
+
     local function wrap(key)
     local function wrap(key)
-      local debounced
       return function(...)
       return function(...)
         local value = util.pack(...)
         local value = util.pack(...)
 
 
-        if debounced then
-          debounced:unsubscribe()
+        if debounced[key] then
+          debounced[key]:unsubscribe()
         end
         end
 
 
         local values = util.pack(...)
         local values = util.pack(...)
 
 
-        debounced = scheduler:schedule(function()
+        debounced[key] = scheduler:schedule(function()
           return observer[key](observer, util.unpack(values))
           return observer[key](observer, util.unpack(values))
         end, time)
         end, time)
       end
       end
@@ -26,7 +27,10 @@ function Observable:debounce(time, scheduler)
     local subscription = self:subscribe(wrap('onNext'), wrap('onError'), wrap('onCompleted'))
     local subscription = self:subscribe(wrap('onNext'), wrap('onError'), wrap('onCompleted'))
 
 
     return Subscription.create(function()
     return Subscription.create(function()
-
+      if subscription then subscription:unsubscribe() end
+      for _, timeout in pairs(debounced) do
+        timeout:unsubscribe()
+      end
     end)
     end)
   end)
   end)
 end
 end