通用承诺

时间:2018-03-27 16:52:03

标签: angular typescript promise

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

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

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

    }

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

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>'.

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

3 个答案:

答案 0 :(得分:4)

该行

.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<SomeD>

答案 1 :(得分:2)

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

then(()=>callanotherFunction());

或明确返回一些内容:

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

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

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

你也可以将第一个承诺的值传递给那个并返回它,使callanotherFunction()只产生副作用:

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

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

比所有这些更好的可能是在评论中采用@ jb-nizet的建议并直接使用observable。

答案 2 :(得分:-1)

指定要返回的承诺类型

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