【问题标题】:What is analogous to Promise.resolve for an Observable?什么类似于 Promise.resolve 的 Observable?
【发布时间】:2017-05-04 05:27:32
【问题描述】:

这是我为 Max Schwarzmueller 在 YouTube 上的 Angular2 教程中挑选的一些代码示例:https://www.youtube.com/playlist?list=PL55RiY5tL51olfU2IEqr455EYLkrhmh3n

import {Injectable} from "angular2/core";
import {CONTACTS} from "./mock-contact";

@Injectable()

export class ContactService {

    getContacts() {
        return Promise.resolve(CONTACTS);
    }

    insertContact(contact: Contact) {
        Promise.resolve(CONTACTS)
            .then(
                (contacts: Contact[]) => contacts.push(contact)
            );
    }

}

在此示例中,CONTACTS 对象是静态 JSON。 Promise 在这里不是必需的,但用于显示服务在现实世界中的使用情况。

我非常了解它,但我正在尝试将这个想法迁移到我使用 observable 而不是 Promise 的服务中。

我想更改 CONTACTS 数组,然后让 Observable 发出 .then 再次告诉所有观察者再做一次。

在 observable 上,这里有什么类似于 Promise.resolve 的? RxJS observables 的文档需要大量阅读。

如果这只是一个愚蠢的想法,或者有更好的方法,请告诉我。

【问题讨论】:

  • “CONTACTS 对象是静态 JSON。” 不,不是。 JSON 是一种用于数据交换的文本表示法(More.) 如果您正在处理 JavaScript 源代码,而不是处理 字符串,那么您就不是在处理 JSON。
  • 好的。我想我的意思是它是从本地 js 文件中提取的数组,而不是 REST api。有什么更好的表达方式?
  • 它来自哪里并不重要。它只是一个数组。
  • 好的,但是它是一个JSON格式的数组。
  • 重点是:不,不是。这是一个数组。解析前是JSON格式(文本),后来被解析了,就不再是JSON了。这是一个数组。我可以告诉你,因为你已经打电话给push。字符串(文本)没有push 方法。

标签: rxjs observable


【解决方案1】:

getContacts() {
  return Observable.of(CONTACTS);
}

observable 将在发出 CONTACTS 后完成。

另见http://paqmind.com/posts/rxjs-error-and-completed-events-demystified/

【讨论】:

【解决方案2】:

以下是就我最初的问题而言的有效代码。我已将 CONTACTS 中的 JSON 格式数组替换为从本地 JSON 文件中提取的数据,并且我处理的是产品而不是联系人。

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Product } from './product';
import { Observable } from 'rxjs/Rx';

@Injectable()

export class ProductsService {

    private _productsUrl = "./products.json";    
    private _productObservable: Observable<Product[]>;
    private _products: Product[];

    constructor(private _http: Http) {

    }

    getProducts() : Observable<Product[]> {

        this._productObservable = this._http.get(this._productsUrl)

            .map((response:Response) => {

                if (this._products == null) 
                {
                    this._products = response.json();
                }
                return this._products;

            })
            .catch((error:any) => Observable.throw(error || 'Server error'));


        return this._productObservable;

    }

    deleteProduct()
    {
        this._products.pop();

        return Observable.of(this._products);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2013-11-07
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多