我一直在从PlayersController代码的几个点调用方法MediaNext()来链接下一次Media播放(如果有)。
MediaNext():any { // any could be typed like Media_I
if(cond1) {
...
return Media1
}
if(cond2) {
...
return Media1
}
//
if(! AutoPlayNext) return null;
//
if(NoMoreMedia) return null;
//
If (condX) {
// in order to wait for the Load() method I am subscribing to its promise
this.Service1.Load(Media).then(() => {
...processing...
return Media
})
??? what do I return here, it does not make sense to return null, since potentially a Media is on its way ???
}
return null // safe catch. nomore media should not happen.
}
我有问题
通过遵守.Load()的承诺,不应阻止我在JS中收集的内容的执行,以等待媒体数据返回。相反,需要执行流程,并且必须返回对MediaNext()的调用。但是,在“ ???”上面的代码中指示的位置我应该返回什么。
是否应该对MediaNext()进行编码以在所有条件下返回承诺?
当我编写承诺和可观察性代码时,我大多会猜测工作,因为它们仍然是理解和掌握的野兽,所以随时建议替代方案。
谢谢您的帮助。
答案 0 :(得分:0)
如果您异步处理.Load
并立即返回,则没有充分的理由使该函数返回任何内容。该操作仍在后端进行。
但是,如果您希望调用方获得有关该操作是否成功的更多信息,则应返回一个承诺。
如果您想返回一个承诺,您可能会发现将其编写为异步函数并使用await this.Service1.Load()
会容易得多。而不是then()
。
答案 1 :(得分:0)
您的方法现在是异步的,并且您正在使用Promise。然后,您需要返回一个承诺,您的消费者可以等待获得结果。要么:
1)兑现诺言
If (condX) {
return this.Service1.Load(Media);
}
2)将您的方法设置为异步并等待内部使用的诺言
async MediaNext():any { // any could be typed like Media_I
// ...
If (condX) {
return await this.Service1.Load(Media);
}
// ...