从订阅打字稿中返回值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从订阅打字稿中返回值相关的知识,希望对你有一定的参考价值。

我将如何从Save()方法返回成功。

public SaveItem() {
 if(save()){ // The goal is to use save method like this
  // Close pop up;
}

public SaveAndNew() {
 if(save()){  // The goal is to use save method like this
  // Create new item;
}


private save() {
 let issuccess = false;

 this.myservice.AddParty(newUserObject)
  .subscribe(data => {   
    if (data['status'].toString() === '1') {
      return issuccess = false;
    } else {
      return issuccess = true;
    }
  },
    (er) => {

      return issuccess = false;
    });
}
  • 如果我有save(): boolean它将抛出Must return a value的错误,如果在订阅之外返回issuccess它将始终返回false值。

我将如何等待保存功能并根据响应返回特定值?

我读过关于回调的内容,它看起来并不优雅,有没有优雅的方法来做到这一点

callbacks-vs-promises-vs-rxjs-vs-async-awaits

如果它是C#我会这样做

var isSuccess = await SaveAsync(party);
答案

你可以让你的save方法返回一个可观察的布尔值

public SaveAndNew() {

this.save().subscribe(success =>
{
    if(success)
    {
      // Create new item;
    }
});

private save() : Observable<boolean> {

 return this.myservice
            .AddParty(newUserObject)
            .map(data=> data['status'].toString() === '1')
            .catch(err => Observable.of(false)); 
}
另一答案

这样的事情怎么样:

public SaveItem() {
 const isNew = false;
 save(isNew)
}

public SaveAndNew() {
 const isNew = true;
 save(isNew)
}


private save(isNew) {

 this.myservice.AddParty(newUserObject)
  .subscribe(data => {   
    if (data['status'].toString() === '1') {
      saveComplete(isNew);
    } else {
      saveFailed(isNew)
    }
  },
    (er) => {
      saveFailed(isNew)
    });
}

saveComplete(isNew) {
  // Check isNew as needed.
  // Close dialog or whatever
}

saveFailed(isNew) {
  // do whatever here
}

或者...... TypeScript现在支持async / await ...所以你可以考虑在这里使用它们。有关更多信息,请参阅此内容:https://medium.com/@benlesh/rxjs-observable-interop-with-promises-and-async-await-bebb05306875

另一答案

在这种情况下,您可以使用promise而不是subscribe。但是在将数据绑定到html时,你应该使用async pipe

所以,你的服务就像

 AddParty(newUserObject) {
        return this.http.post(url)
            .toPromise().then(responce => <any[]>responce.json())
            .catch(error => {
                return error;
            });
    }

并检索看起来像

this.myservice.AddParty(newUserObject)
            .then(data => {
                if (data['status'].toString() === '1') {
                    return issuccess = false;
                } else {
                    return issuccess = true;
                }
            },
            (er) => {

                return issuccess = false;
            });
    }
另一答案

试试吧

public SaveItem() {
 if(save()){ // The goal is to use save method like this
  // Close pop up;
}

public SaveAndNew() {
 if(save()){  // The goal is to use save method like this
  // Create new item;
}


private async save() {
 let issuccess = false;

await  this.myservice.AddParty(newUserObject)
  .subscribe(data => {   
    if (data['status'].toString() === '1') {
      return issuccess = false;
    } else {
      return issuccess = true;
    }
  },
    (er) => {

      return issuccess = false;
    });
      return issuccess ;
}
另一答案

在er操作之后,我们在subscribe()中有另一个action参数,它将帮助您返回而不使用observable。

  public SaveItem() {
     if(save()){ // The goal is to use save method like this
      // Close pop up;
    }

    public SaveAndNew() {
     if(save()){  // The goal is to use save method like this
      // Create new item;
    }


    private save() {
     let issuccess = false;

     this.myservice.AddParty(newUserObject)
      .subscribe(data => {   
        if (data['status'].toString() === '1') {
          issuccess = false;
        } else {
          issuccess = true;
        }
      },
        (er) => {

          issuccess = false;
        },
     () => {return issuccess });
    }

订阅3个参数

subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): 

以上是关于从订阅打字稿中返回值的主要内容,如果未能解决你的问题,请参考以下文章

从订阅打字稿返回值

MEAN STACK angular 2:从打字稿中的多个api获取数据

如何使用打字稿中的查找来推断类型化的 mapValues?

避免任何类型在打字稿中获取枚举值

从 Angular 2 打字稿中的 HTML 获取复选框值。

无法访问父组件 React 打字稿中的转发 Ref 值