同步使用Angular Http.Get()

时间:2019-04-18 16:46:42

标签: javascript angular asynchronous

我有一个非常简单的要求:

我正在为Angular网站编写授权服务(Angular 7会有所作为)。 该服务需要具有用户和资源名称的“ hasPermission”功能。它对后端进行Http.Get()调用以确定用户是否有权访问该资源。当且仅当数据从Get()调用返回时,它返回true或false。

我已经在网上搜索了大约一个星期,试图弄清楚该怎么做。我的问题是Http.Get()返回一个可观察到的,然后继续。这意味着函数将在返回要做出决定的数据之前返回。如果我使用Http.Get().toPromise(),也会发生同样的事情-函数会在创建诺言后立即继续。

我阅读的每个“解决方案”似乎都是“兑现承诺”或“返还可观察物”的某种变体。但是,这就像“乌龟一直向下”一样-在这种情况下,它一直都是诺言(或可观察到的)。在某个时候,需要一种等待并返回数据的方法,而不是对数据的承诺或对数据的可观察性。

我需要某种方法在创建observable或promise之后且函数返回其值之前添加“ waitForDone”,但是从我能找到的所有内容来看,您无法在JavaScript中做到这一点,因为它是单线程的。 请注意,我不能像某些解决方案所建议的那样“仅将代码放在http.get(...)之后在一个单独的函数中,然后从成功回调中调用它”,因为要执行的代码需要从该函数返回。 / p>

async / await并没有这样做,因为async将整个函数变成了一个承诺,因此,即使await可能等待Get()返回数据,该函数仍会继续运行并在获得所需数据之前返回给调用者。

在我看来,这不是一个不寻常的要求。能够发出请求然后在等待数据返回时执行其他操作虽然很好,但是在某些情况下,必须先拥有数据,然后才能执行其他操作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用async-await语法:代替

get(someArgs).subscribe(doStuff);

您可以将async放在函数声明中,然后执行以下操作

const someVal = await get(someArgs).toPromise();
doStuff(someVal); // this line won't execute until get() has resolved the promise

但是,从根本上说,它完全是乌龟。它是Promise食谱之上的语法糖,这就是它被移植到的内容(如果您进行移植的话)。