当前位置: 首页 > 知识库问答 >
问题:

在服务angular2中共享异步数据[重复]

张通
2023-03-14

我可能遗漏了一些非常明显的东西,但我想做的是在组件之间异步共享从服务器获取的数据。

我的服务看起来是这样的:

import {Injectable} from 'angular2/core';
import {ApiService} from './api.service';

@Injectable()
export class UserService {
    private user: Object

    constructor(private _api: ApiService) {}

    getUser(user) {
        return this.user
    }

    setUser(slug) {
        return Promise.resolve(this._api.GET('users/' + slug + '/?slug=true').subscribe(
            data => { this.user = data.json; return data.json; },
            (err)=>console.log(err)
         ))
    }
}

因为流程是异步的,所以我需要promise响应,但是promise的响应返回实际的subscribe对象,而不是返回的< code>data.json。

这是一个配置文件页面,它由嵌套路由组成,所以我不能将数据传递给路由组件。路由组件之一是帖子,加载配置文件后,它应该开始获取服务中当前用户的帖子。

所以这就是我需要发生的:

    < li >用户转到他/她的个人资料。 < li >服务调用setUser('foo '),一旦响应,显示配置文件页面。 < li >使用服务的getUser()将用户的帖子提取到帖子组件中

API 服务如下所示:

import {Injectable} from 'angular2/core';
import {Http, Response, RequestOptions, Headers, Request, RequestMethod} from 'angular2/http';
import {GlobalService} from '../app.service';
import 'rxjs/Rx';


@Injectable()
export class ApiService {
    constructor(private http: Http) {}

    apiURL = 'http://localhost:8000/api/';
    assetURL = 'http://localhost:8000/media/';

    GET(url) {
        var headers = new Headers(), authtoken = localStorage.getItem('authtoken');
        headers.append("Content-Type", 'application/json');

        if (authtoken) {
        headers.append("Authorization", 'Token ' + authtoken)
        }
        headers.append("Accept", 'application/json');

        var requestoptions = new RequestOptions({
            method: RequestMethod.Get,
            url: this.apiURL + url,
            headers: headers
        })

        return this.http.request(new Request(requestoptions))
        .map((res: Response) => {
            if (res) {
                return { status: res.status, json: res.json() }
            }
        });
    }
}

请原谅这个糟糕的问题,如果是这样,我仍在学习 angular2,无法在网上找到具体的解决方案。

共有2个答案

齐泰
2023-03-14

如果你需要一个< code >promise,你可以使用< code >promise

import {toPromise} from 'rxjs/operator/toPromise'

...

   setUser(slug) {
        return this._api.GET('users/' + slug + '/?slug=true')
        .map(
            data => { this.user = data.json; return data.json; }
         )
         .toPromise()
         .catch(err)=>console.log(err));
    }
赵驰
2023-03-14

如果你需要一个promise,你可以用这样的方式:

setUser(slug) {
    return new Promise((resolve, reject) => {
      this._api.GET('users/' + slug + '/?slug=true').subscribe(
        data => {
          this.user = data.json;
          resolve(data.json);
        },
        (err) => {
          console.log(err);
          reject(err);
        }
     ))
}

否则,您将解析订阅而不是接收到的数据...

 类似资料:
  • 问题内容: 我想在控制器之间“绑定更改”异步数据。 我知道这可能有点令人困惑,但我希望有可能。 在以下示例中,如果我在输入中编写内容,则效果很好:http : //jsfiddle.net/Victa/9NRS9/ HTML : JS : 但是,假设我从服务器获取数据。我想像前面的示例一样“链接”数据。http://jsfiddle.net/Victa/j3KJj/ 事实是,我想避免使用“ $ b

  • 我正在使用angular2开发一个应用程序。我有一个场景,需要在路由时(使用router.navigate())将复杂的数据(对象数组)从一个组件传递到另一个组件(它们不是父子关系,而是两个独立的组件)。我在谷歌上搜索过,大多数结果描述了父子组件的场景。我浏览了结果,找到了这些传递数据的方法。 1)创建共享服务2)通过路由参数 第二种方法适合我(尽管我不喜欢上面解释的复杂数据)。我无法使用共享服务

  • 问题内容: 除了编写简单的http服务器之外,绝对是golang的初学者。我正在研究Go作为编写异步过程的一种可能性。如果可以的话,请提供一个简单的示例来说明如何实现: Http请求’a’进入,基于该请求中的POST负载启动操作(在post或url中带有某种唯一标识符)。当请求“ a”仍处于打开状态时,以“ a”开始的异步过程将以原始唯一标识符(请求“ b”)响应同一服务器。我想根据请求“ b”响

  • 问题内容: 有没有办法在AngularJS中的服务之间共享数据? 用例:来自不同服务的数据聚合 例如,我想要一个service1从REST服务加载一些数据。然后,另一个service2将来自另一个REST API的其他数据添加到service1数据中,以创建数据聚合服务。 我基本上是想根据它们使用的API来分离服务,但是仍然有一个服务来最终保存所有数据。 问题答案: 创建使用延迟库的第三项服务,以

  • 我有一个链接生成器服务,它能够生成到特定内容类型的链接(用户的详细信息页面,内容项目的详细信息页面等)。 这个服务真的很好用,而且有同步功能: 现在,我必须为登录用户引入单独的路由,以便将更改为。 我需要添加到链接生成器服务中的唯一更改是检查并返回不同的路由URL。这不是一个问题,只要我的登录用户的信息将是同步可用的。但这不是... 我有一个返回一个承诺。第一次调用它时,它实际上发出了一个服务器请

  • 我正在设计一个微服务架构中的评审分析平台。 应用程序如下所示; null null 问题在于,验证服务需要获取site-a的所有评论,应用验证规则并生成错误(如果有的话)。我知道共享数据库模式和实体打破了微服务体系结构。 一个可能的解决方案是 每当验证服务需要对站点进行审查时,它就会请求网关,网关会将请求重定向到审查服务并采取响应。 这种方法的两个可能缺点是 验证服务是否知道网关?是否会带来依赖?