在 Typescript 中在地图内分配 Observable 时获得未定义

泰勒·阿克利

我试图理解 observables 并遇到了一些挫折。

我有一个save()函数可以调用initialize()获取一些 Id。在 initialize 内部,我在 map 方法 ( payload) 中设置了一个 Observable,当我将结果记录到控制台时,它会被设置为正确的值。我试过切换地图订阅无济于事。

TLDR;从地图/订阅内部为预先提升的变量设置值的正确方法是什么?

相关:如果从对象序列化,什么是正确的 observable 类型?

save(post: Post, draftId?: number, postId?: number): Observable<any> {
    let payload: Observable<any>;
    if (!postId) {
        post.state = post.state ? post.state : 'unsaved';
        this.initialize(post)
            .subscribe((res) => {  //error here... cannot run 
                console.log('Waypoint: posts.service.ts:36');
                payload = res;
            });

    } else if (draftId && postId) {
        post.state = 'autosaved'
        return this.updateDraft(post, draftId);
    };
    return payload;
}

initialize(post: Post): Observable<any> {
    let resultPost: number;
    let resultDraft: number;
    var payload: Observable<any>;
    this.createPost(post)
        .subscribe(res => {
        resultPost = res.id;
        post.postId = res.id
        this.createDraft(post)
            .map(res => {
                resultDraft = res.id;
                let _payload = {
                    postId: resultPost,
                    draftId: resultDraft
                };
                console.log('Waypoint: posts.service.ts:62');
                payload = Observable.create(_payload); // looks good!
            }, (error) => { console.log(error) }).subscribe();

        });
    console.log(payload); //undefined :(
    return payload;
}
皮奇

如果我理解正确,你的逻辑或多或少是这样的

  1. 首先你创建一个Post viacreatePost方法,它返回一个Observable
  2. subcribecreatePost,你会得到包含Post id的结果
  3. 您使用Post id创建一个Draft,该方法createDraft再次返回一个Observable
  4. subscribecreateDraft获得草稿 ID
  5. 那么最终你需要使用Post idDraft id来填充一个有效载荷变量,然后用来做其他事情

我是对的,你可能应该瞄准的是这样的

let postId;
let draftId;
this.createPost(post)
    .map(res => {postId = res.id})
    .mergeMap(() => this.createDraft(post))  // mergeMap is same as flatMap
    .map(res => {draftId = res.id})
    .map(() => [postId, draftId])
    .subscribe(postDraftIds => payload = postDraftIds)

还有其他方法可以使用 Observable 运算符来达到相同的目标(例如,您可以使用 switchMap 而不是 mergeMap - 这里有一个很好的链接,解释了 switchMap 的工作原理),但我希望这足够清楚

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript中未定义的不可分配问题

TypeScript中未定义的协方差

TypeScript:无法读取[null]中未定义的属性“ push”

在nodejs typescript应用程序中未定义define

无法在TypeScript中设置未定义的属性XXX

全局变量在来自webpack的typescript中未定义

Typescript:“ Observable <{}>”类型无法分配给“ Observable”类型

Typescript“ this”实例在类中未定义

遍历Typescript中的observable <Object []>

在组件中使用它时获得了未定义的变量,但已在模板中定义

?:和|有什么区别?在TypeScript中未定义?

ReferenceError:在Jest + Typescript中未定义describe

React Typescript useParams()在useEffect中始终返回未定义

Typescript类变量在Firebase函数中返回未定义

react js中地图内未定义的方法/函数

类型在 Typescript 的服务中显示为未定义

Javascript ReferenceError:在 src 中添加 Rx.js 时未定义 Observable

如何根据Typescript中的范围解决未定义的数据?

api 服务在 observable 中变得未定义

数组作为类成员在 Typescript 中未定义

chrome.extension.getBackgroundPage().VARIABLE 在使用 typescript 时未定义,但在 javascript 中工作正常

$styles 在 webpack 和 typescript 中未定义

更改 observables 时,subscribe 内的 Observable 值未定义

订阅 observable 时,响应以角度显示未定义

无法在 Typescript 中设置未定义的属性“hello”

在数组中查找对象时,Typescript 对象可能未定义

Observable 返回未定义

数组中的值未定义 TypeScript

数组中的值未定义 TypeScript [已解决]