当前位置: 首页 > 面试题库 >

AngularJs:在内部调用$ http或$ resource时,方法会同步返回

虞修平
2023-03-14
问题内容

有没有一种方法可以等待诺言,以便您可以从中获得实际结果并返回,而不是返回诺言本身?我在考虑类似于C#await关键字与Tasks一起工作的方式。

这是为什么我想拥有像canAccess()这样的方法的示例,该方法返回true或false而不是promise,以便可以在if语句中使用它。方法canAccess()将使用$
http或$ resource进行AJAX调用,然后以某种方式等待承诺得到解决。

看起来像这样:

$scope.canAccess = function(page) {
    var resource = $resource('/api/access/:page');
    var result = resource.get({page: page});

    // how to await this and not return the promise but the real value
    return result.canAccess;
}

反正有这样做吗?


问题答案:

一般来说,这是个坏主意。让我来告诉你为什么。浏览器中的JavaScript基本上是单线程的野兽。想到它,它也是Node.js中的单线程。因此,您在开始等待远程请求成功或失败时不进行任何“返回”操作都可能涉及某种循环,以延迟请求之后的代码执行。像这样:

var semaphore = false;
var superImportantInfo = null;

// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
  superImportantInfo = results;

  semaphore = true;
});

while (!semaphore) {
  // We're just waiting.
}

// Code we're trying to avoid running until we know the results of the URL call.
console.log('The thing I want for lunch is... " + superImportantInfo);

但是,如果您在浏览器中尝试这样做,并且调用花费了很长时间,那么浏览器会认为您的JavaScript代码陷入了循环,并在用户的脸上弹出了一条消息,使用户可以停止代码。因此,JavaScript的结构如下:

// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
  // Code we're trying to avoid running until we know the results of the URL call.
  console.log('The thing I want for lunch is... " + results);
});

// Continue on with other code which does not need the super important info or 
// simply end our JavaScript altogether. The code inside the callback will be 
// executed later.

这样的想法是,每当服务调用返回时,便会通过事件触发回调中的代码。因为事件驱动就是JavaScript喜欢它的方式。JavaScript中的计时器是事件,用户操作是事件,用于发送和接收数据的HTTP
/ HTTPS调用也会生成事件。并且您应该构建代码来响应这些事件。

在远程服务调用返回之前,您是否无法构造代码以使其认为canAccess为假,毕竟它确实是真的?我一直在AngularJS代码中这样做,我不知道我应该向用户显示的最终权限是什么,因为我还没有收到它们,或者我没有收到所有要显示在用户端的数据。首先。我有默认显示,直到真实数据返回,然后页面根据新数据调整为新格式。AngularJS的两种方式绑定使这确实非常容易。



 类似资料:
  • 问题内容: 我有一些要调用的Web服务。或,我应该使用哪一个? :https : //docs.angularjs.org/api/ngResource/service/$resource :https : //docs.angularjs.org/api/ng/service/$http 阅读以上两个API页面后,我迷路了。 您能用简单的英语给我解释一下有什么区别,在什么情况下我应该使用它们?如

  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要

  • 问题内容: 有什么方法可以使用AngularJS进行同步调用吗? AngularJS文档不是很明确,也不是为了找出一些基本内容而扩展。 在服务上: 问题答案: 不是现在。如果查看源代码(从2012年10月开始),您会发现对XHR open的调用实际上是硬编码为异步的(第三个参数为true): 您需要编写自己的执行同步调用的服务。通常,由于JavaScript执行的性质,您通常不需要执行此操作,最终

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 常见的情况是,在用户更新/创建一些数据后,我们需要向用户显示错误/成功消息,我们如何在AngularJS中实现它? 我想添加回调,但是找不到解决方案。使用$ http.post()。success()。error()可以工作,但是我想知道是否可以使用更高级别的API $ resource来实现。 或者,我们应该编写指令还是使用$ watch()? 感谢您的帮助。 问题答案: 就像较低级

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符