当前位置: 首页 > 知识库问答 >
问题:

角度JS$q,在多个ajax调用完成后执行一些操作

郦翰学
2023-03-14

我需要在页面加载时加载一些数据,然后执行一个任务。为了获得我想要的数据,我执行了多个不同的ajax调用。但是为了执行任务,我需要确保所有的ajax调用都已经完成。这是我到目前为止所做的:

$q.when(
        $http.get('url1').success(function (data) {
            $scope.data1 = data;
            console.log("ajax1 finished");
        }),
        $http.get('url2').success(function (data) {
            $scope.data2 = data;
            console.log("ajax2 finished");
        }),
        $http.get('url3').success(function (data) {
            $scope.data3 = data;
            console.log("ajax3 finished");
        }),
        $http.get('url4').success(function (data) {
            $scope.data4 = data;
            console.log("ajax4 finished");
        })
    ).then(
        console.log("All ajax calls have finished!"),
        executeTask()
    );

我的问题是块中的代码然后(…);在所有ajax调用完成后没有执行。我在我的控制台中得到了这样的东西:

ajax2 finished
ajax1 finished
All ajax calls have finished!
ajax3 finished
ajax4 finished

我一定是做错了什么。我怎样才能让它按照我想要的方式工作?

编辑:我尝试了下面的方法,就像答案中提到的那样,但是我仍然面临同样的问题。

$q.all([
    $http.get('url1').then(function (data) {
        $scope.data1 = data;
        console.log("");
    }),
    $http.get('url2').success(function (data) {
        $scope.data2 = then;
        console.log("ajax2 finished");
    }),
    $http.get('url3').then(function (data) {
        $scope.data3 = data;
        console.log("ajax3 finished");
    }),
    $http.get('url4').then(function (data) {
        $scope.data4 = data;
        console.log("ajax4 finished");
    })
]).then(
    console.log(""),
    executeTask()
);

共有2个答案

寿丰
2023-03-14

您有两种解决方案:

>

  • 您想使用$q.all()来等待多个Promise的解析。示例:http://jsfiddle.net/ThomasBurleson/QqKuk/

    使用routeProvider的解决机制,以便在呈现屏幕之前预加载Promise:https://docs.angularjs.org/api/ngRoute/provider/$routeProvider

  • 晋奕
    2023-03-14

    我已经使用< code>$q.all()为您制作了一个工作插件

    http://plnkr.co/edit/JHd3XPTKBxx4KRso5JRB?p=preview

      $q.all([
        $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
          $scope.ip.one = response.data
          console.log('one')
        }),
        $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
          $scope.ip.two = response.data
          console.log('two')
        }),
        $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
          $scope.ip.three = response.data
          console.log('three')
        }),
        $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
          $scope.ip.four = response.data
          console.log('four')
        }),
      ]).then(function() {
        console.log('all')
      })
    
     类似资料:
    • 比如在做pwa程序,有个sw.js。在src目录外,希望在构建完成后,将sw.js复制到dist目录(不一定是dist,就是vite最终构建目录)。

    • 问题内容: 我有多个ajax查询同时运行,我希望它们等待最后一个返回,然后在所有ajax调用上运行成功处理程序。作为简化示例,请考虑: 假设所有请求都同时发送。由于它们是异步的,因此它们将在不同的时间返回。假设一个请求返回需要100毫秒,而另一个请求则需要3000毫秒。我显然不知道哪个会最先返回。他们都以某种方式更新了DOM,我希望一次将这些更改一次全部显示给查看器。我该怎么做呢? 我能想到的最好

    • 我是RxJava新手。我想从给定集合中下载每个TempoAccount实体的一些数据,并将其存储在map accountsWithProjects中。当上一个onNext(TempoAccount TempoAccount)的代码完成时,我想调用filterAccountsWithProjects(accountsWithProjects)方法。有什么简单的方法可以实现吗? 问题:在上面的代码中,

    • 问题内容: (做了很多修改,因为它是类的一部分,等等。) 目前,这有点让人讨厌,因为计时器的使用似乎很垃圾。我会使用$ .when和$ .done,但是我不知道可能有多少房间,所以我不知道什么时候放什么。 如何确保仅在所有AJAX请求返回后才调用run_the_rest_of_the_app()? 问题答案: 在进行AJAX调用之前, 完成AJAX调用后(在回调中):

    • 我想在调用非公共方法(bar)后执行一些特定操作。此方法在另一个方法(foo)中调用。请注意,“bar”和“foo”都是在第三方jar文件中定义的。 我试图在面向方面的编程中使用Spring使用注释来做到这一点。然而,我不能这样做。 在调用jar文件中的特定函数之后,有人能告诉我如何做特定的事情(调用特定函数)吗?

    • 问题内容: 我有2个差异函数中的2个ajax调用。我想使用.click调用这两个函数。func1将数据插入到数据库中,然后func2将检索数据,所以我的问题是如何等到func1完全完成后才执行func2。 我尝试了.delay(),它可以工作,但是我认为这是一个愚蠢的解决方案。 问题答案: 三种方式: 成功调用func1时调用func2: 时髦完成后,使用API调用func2: 使func1同步(