我目前正在管理具有此功能的代码
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>'.
我想我必须返回正确的对象类型?我应该说我对承诺并不熟悉。
答案 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 */);