আরএক্সজেএস: আমি কীভাবে একটি পর্যবেক্ষণযোগ্যকে "ম্যানুয়ালি" আপডেট করব?


139

আমি মনে করি আমার অবশ্যই কিছু মৌলিক ভুল বোঝাবুঝি হতে হবে, কারণ আমার মনের মধ্যে এটি একটি পর্যবেক্ষণযোগ্যের পক্ষে সবচেয়ে প্রাথমিক বিষয় হওয়া উচিত তবে আমার জীবনের জন্য আমি কীভাবে ডক্স থেকে এটি করব তা বুঝতে পারি না।

মূলত, আমি এটি করতে সক্ষম হতে চাই:

// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
   function(x){
     console.log('next: ' + x);
   }
...
var my_function = function(){
  eventObservable.push('foo'); 
  //'push' adds an event to the datastream, the observer gets it and prints 
  // next: foo
}

তবে আমি এর মতো কোনও পদ্ধতি খুঁজে পাচ্ছি না push। আমি এটি একটি ক্লিক হ্যান্ডলারের জন্য ব্যবহার করছি, এবং আমি জানি যে তাদের Observable.fromEventকাছে এটি রয়েছে তবে আমি এটি ব্যবহার করে চেষ্টা করছি রিঅ্যাক্টের সাথে এবং আমি সম্পূর্ণ ভিন্ন ব্যবহারের পরিবর্তে কেবল একটি কলব্যাকে ডেটাস্ট্রিমটি আপডেট করতে সক্ষম হবো ইভেন্ট হ্যান্ডলিং সিস্টেম। সুতরাং মূলত আমি এটি চাই:

$( "#target" ).click(function(e) {
  eventObservable.push(e.target.text()); 
});

আমার কাছে সবচেয়ে কাছেরটি ব্যবহার করছিল observer.onNext('foo') , তবে এটি বাস্তবে কাজ করে বলে মনে হচ্ছে না এবং এটি পর্যবেক্ষকের কাছে ডাকা হয়েছে, যা সঠিক বলে মনে হচ্ছে না। পর্যবেক্ষকের উচিত তথ্য প্রবাহের প্রতিক্রিয়াযুক্ত জিনিসটি, এটি পরিবর্তন করা উচিত নয়, তাই না?

আমি কি কেবল পর্যবেক্ষক / পর্যবেক্ষণযোগ্য সম্পর্ক বুঝতে পারি না?


আপনার ধারণাটি পরিষ্কার করার জন্য এটি একবার দেখুন (আপনার অনুপস্থিত রিঅ্যাকটিভ প্রোগ্রামিংয়ের পরিচিতি): gist.github.com/staltz/868e7e9bc2a7b8c1f754 । এখানেও একগুচ্ছ সংস্থান রয়েছে যা থেকে আপনি আপনার বোঝার উন্নতি করতে পারবেন: github.com/Reactive-Extensions/RxJS#resources
user3743222

আমি প্রথমটি চেক আউট করেছি, মনে হচ্ছে একটি শক্ত সম্পদ। দ্বিতীয়টি একটি দুর্দান্ত তালিকা, এর উপরে আমি aaronstacy.com/writings/reactive-programming-and-mvc খুঁজে পেয়েছি যা আমাকে Rx.Subject আবিষ্কার করতে সহায়তা করেছে, যা আমার সমস্যা সমাধান করে। সূতরাং ধন্যবাদ! একবার আমি আরও কিছু অ্যাপ্লিকেশন লিখেছি আমি আমার সমাধান পোস্ট করব, কেবল এটি কিছুটা পরীক্ষা করতে চাই।
লিয়ামড

হেই, এই প্রশ্ন জিজ্ঞাসা করার জন্য আপনাকে অনেক ধন্যবাদ, আমি খুব একই কোড নমুনাটি মাথায় রেখে খুব একই প্রশ্নটি করতে
চলেছিলাম

উত্তর:


154

আরএক্সে, পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য স্বতন্ত্র সত্তা। একটি পর্যবেক্ষক একটি পর্যবেক্ষণযোগ্য সাবস্ক্রাইব। একটি পর্যবেক্ষণযোগ্য পর্যবেক্ষকদের পদ্ধতিগুলিতে কল করে তার পর্যবেক্ষকদের কাছে আইটেমগুলি নির্গত করে। আপনার যদি ক্ষেত্রের বাইরে পর্যবেক্ষক পদ্ধতিগুলি কল করতে হয় তবে আপনি Observable.create()একটি সাবজেক্ট ব্যবহার করতে পারেন, এটি এমন একটি প্রক্সি যা একই সময়ে পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য হিসাবে কাজ করে।

আপনি এটির মতো করতে পারেন:

var eventStream = new Rx.Subject();

var subscription = eventStream.subscribe(
   function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

var my_function = function() {
  eventStream.next('foo'); 
}

আপনি এখানে বিষয়গুলি সম্পর্কে আরও তথ্য পেতে পারেন:


1
আসলে আমি যা করছিলাম তা হ'ল! আমার যা করা দরকার তা করার জন্য আমি আরও ভাল উপায় খুঁজে পেতে পারি কিনা তা দেখার জন্য আমি এটিতে চেষ্টা চালিয়েছি, তবে এটি অবশ্যই একটি কার্যকর সমাধান। আমি এই নিবন্ধে এটি প্রথম দেখেছি: aaronstacy.com/writings/reactive-programming-and-mvc
লিয়ামড

34

আমি বিশ্বাস করি Observable.create()যে কোনও পর্যবেক্ষক কলব্যাক প্যারাম হিসাবে নয় তবে একটি প্রেরক হিসাবে গ্রহণ করেন । সুতরাং আপনি যদি নিজের পর্যবেক্ষণযোগ্যতে একটি নতুন মান যুক্ত করতে চান তবে পরিবর্তে এটি ব্যবহার করে দেখুন:

var emitter;
var observable = Rx.Observable.create(e => emitter = e);
var observer = {
  next: function(next) {
    console.log(next);
  },
  error: function(error) {
    console.log(error);
  },
  complete: function() {
    console.log("done");
  }
}
observable.subscribe(observer);
emitter.next('foo');
emitter.next('bar');
emitter.next('baz');
emitter.complete();

//console output
//"foo"
//"bar"
//"baz"
//"done"

হ্যা সাবজেক্টটি একই বস্তুতে পর্যবেক্ষণযোগ্য এবং পর্যবেক্ষক সরবরাহ করা সহজ করে তোলে, তবে এটি হুবহু একই নয়, কারণ সাবজেক্ট আপনাকে একই পর্যবেক্ষকটিতে একাধিক পর্যবেক্ষককে সাবস্ক্রাইব করতে দেয় যখন কোনও পর্যবেক্ষণযোগ্য কেবলমাত্র সর্বশেষ সাবস্ক্রাইব করা পর্যবেক্ষকের কাছে ডেটা প্রেরণ করে, তাই সচেতনভাবে এটি ব্যবহার করুন । আপনি যদি এটির সাথে টিঙ্কার করতে চান তবে এখানে একটি জেএসবিন রয়েছে


RxJS ম্যানুয়ালগুলিতে কোথাও নথিভুক্ত ইমিটর সম্পত্তি ওভাররাইটিংয়ের সম্ভাবনা?
টমাস

এই ক্ষেত্রে emitterশুধুমাত্র হবে next()পর্যবেক্ষক জন্য নতুন মান গত সাবস্ক্রাইব যে। emitterএকটি অ্যারেতে সমস্ত সংগ্রহ করা এবং তাদের সকলের মাধ্যমে পুনরাবৃত্তি করা এবং nextতাদের প্রতিটির মান
এরিক গোপাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.