Sdílet prostřednictvím


Observable.Defer<TValue> – metoda

Vrátí pozorovatelnou sekvenci, která vyvolá pozorovatelnou továrnu vždy, když se nový pozorovatel přihlásí k odběru.

Obor názvů:System.Reactive.Linq
Sestavení: System.Reactive (v System.Reactive.dll)

Syntax

'Declaration
Public Shared Function Defer(Of TValue) ( _
    observableFactory As Func(Of IObservable(Of TValue)) _
) As IObservable(Of TValue)
'Usage
Dim observableFactory As Func(Of IObservable(Of TValue))
Dim returnValue As IObservable(Of TValue)

returnValue = Observable.Defer(observableFactory)
public static IObservable<TValue> Defer<TValue>(
    Func<IObservable<TValue>> observableFactory
)
public:
generic<typename TValue>
static IObservable<TValue>^ Defer(
    Func<IObservable<TValue>^>^ observableFactory
)
static member Defer : 
        observableFactory:Func<IObservable<'TValue>> -> IObservable<'TValue> 
JScript does not support generic types and methods.

Parametry typu

  • Tvalue
    Typ hodnoty.

Parametry

  • observableFactory
    Typ: System.Func<IObservable<TValue>>
    Pozorovatelná funkce továrny, která se má vyvolat pro každého pozorovatele, který se přihlásí k odběru výsledné sekvence.

Návratová hodnota

Typ: System.IObservable<TValue>
Pozorovatelná sekvence, jejíž pozorovatelé aktivují vyvolání dané pozorovatelné funkce továrny.

Poznámky

Operátor Pozdržet umožňuje odložit nebo zpozdit vytvoření sekvence na dobu, kdy se pozorovatel přihlásí k odběru sekvence. To je užitečné k tomu, aby pozorovatel mohl snadno získat aktualizace nebo aktualizovanou verzi sekvence.

Příklady

Tento příklad ukazuje operátor Pozdržet vytvořením pozorovatelné posloupnosti informací o produktech používaných firmou nebo spotřebitelem. Pozorovatelná posloupnost poskytuje přístup k aktuálním úrovním zásob. Vytvořením odložené pozorovatelné sekvence může aplikace nechat aktualizované úrovně inventáře vypsat do aplikace jednoduchým opětovným přihlášením k odběru pozorovatelné sekvence.

using System;
using System.Reactive.Linq;

namespace Example
{

  class Program
  {

    static void Main()
    {
      //*****************************************************************************************************//
      //*** Product inventories change from time to time. This example demonstrates the Defer operator    ***//
      //*** by creating an observable sequence of the Product class. The creation of the sequence is      ***//
      //*** deferred until the observer calls Subscribe and a new observable sequence is always generated ***//
      //*** at that time with the latest inventory levels to be sent to the observer.                     ***//
      //*****************************************************************************************************//
      ProductInventory myInventory = new ProductInventory();
      IObservable<Product> productObservable = Observable.Defer(myInventory.GetUpdatedInventory);


      //******************************************************//
      //*** Generate a simple table in the console window. ***//
      //******************************************************//
      Console.WriteLine("Current Inventory...\n");
      Console.WriteLine("\n{0,-13} {1,-37} {2,-18}", "Product Name", "Product ID", "Current Inventory");
      Console.WriteLine("{0,-13} {1,-37} {2,-18}", "============", "====================================",
                        "=================");

      //**********************************************************************************//
      //*** Each product in the sequence will be reported in the table using the       ***//
      //*** Observer's OnNext handler provided with the Subscribe method.              ***//
      //**********************************************************************************//
      productObservable.Subscribe(prod => Console.WriteLine(prod.ToString()));


      //******************************************************************************************************//
      //*** To get the updated sequence from the deferred observable all we have to do is subscribe again. ***//
      //******************************************************************************************************//
      Console.WriteLine("\n\nThe updated current Inventory...\n");
      Console.WriteLine("\n{0,-13} {1,-37} {2,-18}", "Product Name", "Product ID", "Current Inventory");
      Console.WriteLine("{0,-13} {1,-37} {2,-18}", "============", "====================================",
                        "=================");

      productObservable.Subscribe(prod => Console.WriteLine(prod.ToString()));


      Console.WriteLine("\nPress ENTER to exit...\n");
      Console.ReadLine();
    }



    //**************************************************************************************************//
    //***                                                                                            ***//
    //*** The Product class holds current product inventory information and includes the ability for ***//
    //*** each product to display its information to the console window.                             ***//
    //***                                                                                            ***//
    //**************************************************************************************************//
    class Product
    {
      private readonly string productName;
      private readonly string productID;
      private int currentInventory;

      public Product(string name, int inventory)
      {
        productName = name;
        productID = Guid.NewGuid().ToString();
        currentInventory = inventory;
      }

      public void RemoveInventory(int delta)
      {
        currentInventory -= delta;

        if (currentInventory < 0)
          currentInventory = 0;
      }

      public override string ToString()
      {
        return String.Format("{0,-13} {1,-37} {2,-18}", productName, productID, currentInventory);
      }
    }



    //*****************************************************************************************************//
    //***                                                                                               ***//
    //*** The ProductInventory class initializes all our product information and provides an Observable ***//
    //*** sequence of the product inventories through the GetUpdatedInventory() method. This method     ***//
    //*** is provided to our call to Observable.Defer() so that all subscriptions against the deferred  ***//
    //*** observable get the lastest inventory information whenever Subscribe is called.                ***//
    //***                                                                                               ***//
    //*****************************************************************************************************//
    class ProductInventory
    {
      private Product[] products = new Product[5];
      private Random random = new Random();

      public ProductInventory()
      {
        for (int i = 0; i < 5; i++)
        {
          //*************************************************************//
          //*** Initial inventories will be a random count under 1000 ***//
          //*************************************************************//
          products[i] = new Product("Product " + (i + 1).ToString(), random.Next(1000));
        }
      }

      public IObservable<Product> GetUpdatedInventory()
      {
        //***************************************************************************************************//
        //*** When inventory for each product is updated up to 50 of each product is consumed or shipped. ***//
        //***************************************************************************************************//
        for (int i = 0; i < 5; i++)
          products[i].RemoveInventory(random.Next(51));

        //****************************************************************************************************//
        //*** This updated observable sequence is always provided by this method when Subscribe is called. ***//
        //****************************************************************************************************//
        IObservable<Product> updatedProductSequence = products.ToObservable();
        return updatedProductSequence;
      }
    }
  }
}

Následuje příklad výstupu z ukázkového kódu.

Current Inventory...


Product Name  Product ID                            Current Inventory
============  ====================================  =================
Product 1     04e76657-c403-4208-a300-a3ba42fbe218  808
Product 2     3bc7f823-6624-4803-b673-ec2e7d8802b7  114
Product 3     1e5755f3-6301-4faa-8e1b-35765dc73bce  2
Product 4     f691ddef-b679-42a2-99c7-83651fbf1cc5  894
Product 5     df1f331b-8a52-4a54-a2fb-63d69dda6c1a  467


The updated current Inventory...


Product Name  Product ID                            Current Inventory
============  ====================================  =================
Product 1     04e76657-c403-4208-a300-a3ba42fbe218  761
Product 2     3bc7f823-6624-4803-b673-ec2e7d8802b7  81
Product 3     1e5755f3-6301-4faa-8e1b-35765dc73bce  0
Product 4     f691ddef-b679-42a2-99c7-83651fbf1cc5  890
Product 5     df1f331b-8a52-4a54-a2fb-63d69dda6c1a  440

Press ENTER to exit...

Viz také

Reference

Pozorovatelná třída

System.Reactive.Linq – obor názvů