【问题标题】:Generic promise一般承诺
【发布时间】:2018-03-28 01:06:56
【问题描述】:

我目前正在管理具有此功能的代码

public getData(somei: Somei): Promise<SomeD> {

       return new Promise((resolve, reject) => {
               this.getSomeD(somei).subscribe((someData: SomeD) => {
                   resolve(someData);
               });
        });

    }

这很好用。我想在上面的代码执行后添加一个 then 来执行一个动作,但我似乎没有让它工作。 我试过了

public getData(somei: Somei): Promise<SomeD> {

       return new Promise((resolve, reject) => {
               this.getSomeD(somei).subscribe((someData: SomeD) => {
                   resolve(someData);
               });
        }).then(()=>{callanotherFunction()});

    }

但我收到打字稿错误

 Type 'Promise<void>' is not assignable to type 'Promise<SomeD>'.

我想我必须返回正确的对象类型?我应该说我对 Promise 不太熟悉。

【问题讨论】:

  • 这很好用:不,它没有。如果可观察到的错误,那么您返回的承诺永远不会解决,但也永远不会出错。所以调用者无法知道发生了错误。这是一种反模式。使用 Observable.toPromise(),或者直接返回 Observable 而不是将其转换为 Promise。你必须学习 observables 才能有效地使用 Angular。所以现在是开始学习它们的最佳时机。你应该拥有的只是return this.getSomeD(somei).pipe(tap(() =&gt; callanotherFunction()));
  • 我假设您的 callanotherFunction 是一个 void 函数。我怀疑你只想返回你的新承诺。
  • 您可能还想查找await 以及它与使用then 回调的区别。
  • 关于你对 Promise 不熟悉,我最近写了一个对一个有点不同的问题的答案,但你仍然可能会发现它很有用:stackoverflow.com/a/47413446/457268

标签: angular typescript promise


【解决方案1】:

线

.then(()=>{callanotherFunction()});

是问题所在。由于该匿名函数不返回任何内容(它仅调用 callanotherFunction),因此您的承诺已从返回 SomeD 更改为返回 void,这是打字稿向您指出的错误。

正如您所说,解决方案是返回正确的东西。在这种情况下,我认为你有两个选择。要么将承诺保存到变量中,然后在上面执行 .then,然后返回原件。或者您可以截取原始结果并在您的匿名函数中转发它。

以下是两者的示例:

const prom = new Promise((resolve, reject) => {
    this.getSomeD(somei).subscribe((someData: SomeD) => {
        resolve(someData);
    });
});

// Do your code when promise resolves, but return original:
prom.then(() => { callanotherFunction() });
return prom;

或者,只是转发结果:

return new Promise((resolve, reject) => {
    this.getSomeD(somei).subscribe((someData: SomeD) => {
        resolve(someData);
    });
}).then(result => { callanotherFunction(); return result; }); // Forward the result

使用其中任何一个,返回类型将保持为Promise&lt;SomeD&gt;

【讨论】:

    【解决方案2】:

    它抱怨是因为你的第二个承诺(then())没有返回任何东西,但你的签名说它会。如果callanotherFunction 返回某些内容,您可以通过删除then 正文中的大括号来返回:

    then(()=>callanotherFunction());
    

    或显式返回一些东西:

    .then(()=>{
       return callanotherFunction()
    });
    

    如果callanotherFunction() 没有返回任何内容,那么您的签名是错误的,应该更改以反映这一点:

    public getData(somei: Somei): Promise<Void> {
    

    您还可以将第一个承诺的值传递给 then 并返回它,从而使 callanotherFunction() 只是一个副作用:

     .then((someData)=>{
       callanotherFunction()
       return someData
    });
    

    这假设 callanotherFunction() 不执行一些需要首先发生的异步操作。

    比这一切更好的可能是在 cmets 中接受@jb-nizet 的建议并直接使用 observables。

    【讨论】:

      【解决方案3】:

      指定要返回的承诺类型

      return new Promise<SomeD>(/* blablabla */);
      

      【讨论】:

        猜你喜欢
        • 2015-06-05
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多