繁体   English   中英

同步使用 Angular Http.Get()

[英]Using Angular Http.Get() synchronously

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

我正在为 Angular 站点编写授权服务(Angular 7 有所不同)。 该服务需要一个“hasPermission”函数,它接受一个用户和一个资源名称。 它向后端发出Http.Get()调用以确定用户是否有权访问该资源。 当且仅当数据从Get()调用返回时,它返回 true 或 false。

我已经在网上搜索了大约一个星期,试图弄清楚如何去做。 我的问题是Http.Get()返回一个可观察的然后继续。 这意味着函数在接收到数据之前返回以做出决定。 如果我使用Http.Get().toPromise()也是同样的事情——一旦承诺被创建,函数就会继续。

似乎我读到的每个“解决方案”都是“返回承诺”或“返回可观察对象”的某种变体。 但是它类似于“一路向下是海龟”——在这种情况下,它是一路向上的承诺(或可观察的)。 在某些时候需要有一个方法来等待并返回数据,而不是数据的承诺或数据的可观察。

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

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

在我看来,这是一个不寻常的要求。 虽然能够发出请求然后在等待数据回来的同时去做其他事情是很好的,但有时必须先拥有数据才能做任何其他事情。

任何帮助表示赞赏。

您可以使用 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 配方之上的语法糖,这就是它被转译成的(如果你转译的话)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM