অ্যাপ্লিকেশনটি কৌনিক 2 এ শুরু হলে কীভাবে পরিষেবা চালানো যায়


97

আমি একটি পরিষেবা সকেট সার্ভিস তৈরি করেছি, যা মূলত এটি সকেটটিকে আরম্ভ করে অ্যাপটিকে বন্দরে শোনার জন্য। এই পরিষেবাটি কিছু উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করে।

// socket.service.ts

export class SocketService {
    constructor() {
        // Initializes the socket
    }
    ...
}

আমি জানি সকেট সার্ভিস এর কনস্ট্রাক্টরে কোড (কোড) কেবল তখন চালানো শুরু হয় যখন কোনও উপাদান সকেট সার্ভিস ব্যবহার করে।

এবং সাধারণত অ্যাপ্লিকেশনগুলিতে কোডগুলি দেখতে এই রকম হয়:

// app.ts

import {SocketService} from './socket.service';
...
class App {
    constructor () {}
}
bootstrap(App, [SocketService]);

তবে আমি অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে এই পরিষেবাটি চালানো চাই run সুতরাং আমি একটি কৌশল তৈরি করেছি, কেবল private _socketService: SocketServiceঅ্যাপ্লিকেশন এর কনস্ট্রাক্টর () এ যুক্ত করুন। সুতরাং এখন কোডগুলি এর মতো দেখাচ্ছে:

// অ্যাপ.টি (নতুন)

import {SocketService} from './socket.service';
...
class App {
    constructor (private _socketService: SocketService) {}
}
bootstrap(App, [SocketService]);

এখন এটা কাজ করছে. সমস্যাটি হ'ল সকেট সার্ভিস এর কনস্ট্রাক্টর () রানে কোডগুলি কখনও কখনও হয় না। তাহলে আমি কীভাবে এটি সঠিকভাবে করব? ধন্যবাদ


এই গাইডটি আমাকে সহায়তা করেছে: কৌণিক.ই.ও.
ডকস

উত্তর:


130

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

অ্যাপ্লিকেশনালিয়জারটি কৌণিক / কোরতে সংজ্ঞায়িত করা হয়। আপনি এটি আপনার app.module.ts এর মধ্যে অন্তর্ভুক্ত করেন।

import { APP_INITIALIZER } from '@angular/core';

অ্যাপ্লিকেশনআইটিআইজার হ'ল একটি ওপাক টোকেন (বা অ্যাংজুলার 4 সাল থেকে ইনজেকশন টোকেন ) যা অ্যাপ্লিকেশনআইনিস্ট্যাটাস পরিষেবাটি উল্লেখ করে। অ্যাপ্লিকেশনআইনিস্ট্যাটাস একটি বহু সরবরাহকারী । এটি একাধিক নির্ভরতা সমর্থন করে এবং আপনি এটি একাধিকবার আপনার সরবরাহকারীর তালিকায় ব্যবহার করতে পারেন। এটি এভাবে ব্যবহার করা হয়।

@NgModule({
  providers: [
    DictionaryService,
    {
      provide: APP_INITIALIZER,
      useFactory: (ds: DictionaryService) => () => return ds.load(),
      deps: [DictionaryService],
      multi: true
    }]
})
export class AppModule { }

এই সরবরাহকারীর ঘোষণাটি অ্যাপ্লিকেশনআইনিস্ট্যাটাস ক্লাসকে অভিধানসোসরিও.লোড () পদ্ধতি চালানোর জন্য বলে। লোড () একটি প্রতিশ্রুতি দেয় এবং প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত অ্যাপ্লিকেশনআইনটিস্টাস অ্যাপ স্টার্টআপটিকে অবরুদ্ধ করে। লোড () ফাংশনটি এভাবে সংজ্ঞায়িত করা হয়।

load(): Promise<any> {
  return this.dataService.getDiscardReasons()
  .toPromise()
  .then(
    data => {
      this.dictionaries.set("DISCARD_REASONS",data);
    }
  )
}

অভিধানটি প্রথমে লোড হয়ে যায় এবং অ্যাপের অন্যান্য অংশগুলি নিরাপদে এর উপর নির্ভর করতে পারে তার মতো সেট আপ করুন।

সম্পাদনা করুন: সচেতন থাকুন যে এটি আপনার অ্যাপ্লিকেশানের জন্য আপ-ফ্রন্ট লোডের সময় বাড়িয়ে দেবে ততক্ষণে লোড () পদ্ধতিটি যত বেশি সময় নেয়। আপনি যদি এড়াতে চান তবে পরিবর্তে আপনি আপনার রুটে একটি রিসলভার ব্যবহার করতে পারেন ।


এই জন্য আপনাকে ধন্যবাদ ... খুব সহায়ক
গৌরব জোশী

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বর্তমানের কোডটি কেবল একটি পংক্তির কোড থেকে একটি initপদ্ধতিতে সরায় । যদিও নির্মাণকারীদের যথাসম্ভব সহজ রাখা উচিত, একা এই চিন্তাই এটির যথাযথ সমাধান করে না। ব্যবহার APP_INITIALIZERকরে।
জেপি দশ বার্জ

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

করার সেরা উপায়
রেনিল বাবু

58

SocketServiceপরিবর্তে কোনও পদ্ধতিতে আপনার কনস্ট্রাক্টারে লজিকটি সরান এবং তারপরে এটি আপনার মূল উপাদানটির কনস্ট্রাক্টরে বা কল করুনngOnInit

সকেট সার্ভিস

export class SocketService{
    init(){
        // Startup logic here
    }
}

অ্যাপ

import {SocketService} from './socket.service';
...
class App {
    constructor (private _socketService: SocketService) {
        _socketService.init();
    }
}
bootstrap(App, [SocketService]);

4
আমি বুঝতে পারি না কনস্ট্রাক্টরের পরিবর্তে পদ্ধতিতে পেছনের লজিকটি কী করে আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন, পদ্ধতিতে লজিক করার সুবিধা কী?
পারদীপ জৈন

4
একটি পরিচ্ছন্ন পদ্ধতির
imho

12
নির্মাতারা যতটা সম্ভব সহজ হতে হবে (সাধারণত কেবলমাত্র ইনজেকশন পয়েন্ট), যদি আপনার অতিরিক্ত যুক্তি যুক্ত করতে হয় তবে এনজিওইনাইট হুক ব্যবহার করুন।
সেরজিও 21

4
তবুও দলটি অন্যটি চিন্তা করে নি .. আমি কৌণিক 4 নিয়ে যত বেশি কাজ করি আমি বুঝতে পারি যে অরেলিয়া কাঠামোটি কতটা দুর্দান্তভাবে নির্মিত ly এটি কেবলমাত্র ডেকরেটর যুক্ত করে বাক্সের বাইরে এই সমস্ত সম্ভাবনা রয়েছে। তারা ছেলেরা জানে যে তারা কী করছে।
জোয়েল হার্নান্দেজ

4
@ কোডিবাগস্টাইন এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। যদি এটি কেবল আগুনে-ভুলে যায় তবে কেবল অ্যাসিঙ্ক পদ্ধতিতে কল করুন। ফলাফলের জন্য অপেক্ষা করতে হলে আপনি Promiseনিজের init()পদ্ধতি থেকে কোনওটি ফিরে আসতে পারেন এবং প্রয়োজন অনুযায়ী চেইন করতে পারেন । যাই হোক না কেন এটা করতে পারেন সম্পন্ন করা, কিন্তু সম্ভবত কঠিন হবে এবং বিস্তারিত কাজ আপনি আপ হবে। আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে আপনি সর্বদা আপনার সঠিক সমস্যার বিবরণ সহ একটি প্রশ্ন পোস্ট করতে পারেন এবং সম্প্রদায়টি আপনাকে সহায়তা করে খুশি হবে।
SnareChops


1

পরিষেবা নির্মাণকারী তৈরি করার চেষ্টা করুন এবং তারপরে আপনার উপাদানটির এনজিওএনইট () এ এটি কল করুন।

  • পরিষেবা মডিউল

 export class SocketService {
    constructor() { }
        getData() {
            //your code Logic
        }
}

  • উপাদান

export class AppComponent {
    public record;  
    constructor(private SocketService: DataService){ }
    ngOnInit() {        
        this.SocketService.getData()
        .subscribe((data:any[]) => {
            this.record = data;
        });   
  }  
}       

আশাকরি এটা সাহায্য করবে.


4
@ হংবো অ্যাপ্লিকেশন শুরু হওয়ার পরে পরিষেবাটি চালানোর জন্য চায়, কোনও নির্দিষ্ট উপাদান যা পরিষেবাটি ব্যবহার করছে তা নয়
জারোদ মোসার

এই সত্যিই সহজ উত্তর আমার জন্য কাজ করে। আমি সহজ উত্তর পছন্দ করি। ধন্যবাদ
87
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.