如何在 Angular 6 / Typescript 中延迟可观察对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/50788571/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-21 05:28:43  来源:igfitidea点击:

How to delay an observable in Angular 6 / Typescript

angulartypescript

提问by Jimmyt1988

I have the following method GetCurrentUserDelayedTestthat i wanted to put a delay on. I have left the original implementation here GetCurrentUserto demonstrate how i was originally using it:

我有以下GetCurrentUserDelayedTest我想延迟的方法。我在此处留下了原始实现GetCurrentUser来演示我最初是如何使用它的:

import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { User } from '../models/user';

export class UserService {

    // Normal method without delay
    public GetCurrentUser(): Observable<User>
    {
        return of(new User(""));
    }

    // Method with delay attempt at code
    public GetCurrentUserDelayedTest(): Observable<User>
    {
        var observable = new Observable<User>((observable) => {
            setTimeout(() => {
                return observable.complete();
            }, 2000);
        });

        observable.subscribe(() => {
            return of(new User(""));
        });

        return observable;
    }
}

I'm trying to delay the method from returning its data by 2 seconds.

我试图将方法从返回数据延迟 2 秒。

What am i doing wrong? I'm brand new to angular 6 and typescript.

我究竟做错了什么?我是 angular 6 和 typescript 的新手。

I'm calling it like this:

我这样称呼它:

this.userService.GetCurrentUserDelayedTest()
    .subscribe((currentUser) => {
        this.loadingGameState = false;
    });

The "Loading App" part remains on screen (no errors are thrown) rather than updating the view to show "Welcome"

“正在加载应用程序”部分保留在屏幕上(不会引发错误)而不是更新视图以显示“欢迎”

<div *ngIf="loadingGameState">Loading App</div>
<div *ngIf="!loadingGameState">
  Welcome
</div>

Edit:

编辑:

enter image description here

在此处输入图片说明

Argument of type 'Promise' is not assignable to parameter of type 'OperatorFunction'. Type 'Promise' provides no match for the signature '(source: Observable): Observable'.

“Promise”类型的参数不可分配给“OperatorFunction”类型的参数。类型 'Promise' 与签名 '(source: Observable): Observable' 不匹配。

回答by izmaylovdev

you can use delayfunction

你可以使用延迟功能

public GetCurrentUserDelayedTest(): Observable<User>
{
    return of(new User(""))
       .pipe(delay(2000));
}

回答by Ilya Scharrenbroich

A more detailed example using HttpClient:

使用 HttpClient 的更详细示例:

of(null).pipe(
  delay(2000),
  flatMap(() => {
    return this.http.post<any>(url, params);
  })
);

回答by Bogdan Bogdanov

https://stackblitz.com/edit/angular-mznw5m?file=src%2Fapp%2Fuser.service.ts

https://stackblitz.com/edit/angular-mznw5m?file=src%2Fapp%2Fuser.service.ts

Use in the declaration of the Observableobservable.next()so you can trigger the subscribers.

在 的声明中使用,Observableobservable.next()以便您可以触发订阅者。