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

Angular将并行和链接请求与$ http.then()和$ q.all()组合

邵伟泽
2023-03-14
问题内容

我要进行一组相当复杂的API调用,并且我尝试尽可能地做到优雅和高效。我了解如何使用服务的promise api
$http来链接请求,以及如何使用$q服务并行进行请求。但是对于此特定的API工作流程,我需要同时进行。

这是高级API流程的示例

  • /dog/<dog_id>
    • /breed/<breed_id>
    • /food/<food_id>
  • /cat/<cat_id>
  • /turkey/<turkey_id>
  • /fish/<fish_id>

第一层请求均具有已知ID。然而,<breed_id>需要使/breed呼叫必须从解析/dog响应,并<food_id>作出必要的/food呼叫必须从解析/breed响应。因此/dog/breed/food都需要链接起来。但是/cat/turkey/fish可以与整个/dog链条平行。

我现在所拥有的(并且工作正常)是两组独立的请求。我如何改善这一流程?有没有一种方法可以将两个堆栈组合在一起,从而导致一个单次执行Promise
.then()

var dogId = '472053',
    catId = '840385',
    turkeyId = '240987',
    fishId = '510412';

var myData = {};

var firstSetComplete = false,
    secondSetComplete = false,
    returnData = function() {
        if (firstSetComplete && secondSetComplete) {
            console.log("myData.dog", myData.dog);
            console.log("myData.dog.breed", myData.dog.breed);
            console.log("myData.dog.food", myData.dog.food);
            console.log("myData.cat", myData.cat);
            console.log("myData.turkey", myData.turkey);
            console.log("myData.fish", myData.fish);
        }
    };

// first call set
$http.get('http://example.com/dog/' + dogId)
.then(function(response) {
    myData.dog = response.data;
    return $http.get('http://example.com/breed/' + response.data.breed_id);
})
.then(function(response) {
    myData.dog.breed = response.data;
    return $http.get('http://example.com/food/' + response.data.food_id);
})
.then(function(response) {
    myData.dog.food = response.data;

    firstSetComplete = true;
    returnData();
});

// second call set
$q.all([
    $http.get('http://example.com/cat/' + catId),
    $http.get('http://example.com/turkey/' + turkeyId),
    $http.get('http://example.com/fish/' + fishId)
])
.then(function(responses) {
    myData.cat = responses[0].data;
    myData.turkey = responses[1].data;
    myData.fish = responses[2].data;

    secondSetComplete = true;
    returnData();
});

问题答案:

您可以像这样传递第一个链:

$q.all([
    $http.get('http://example.com/cat/' + catId),
    $http.get('http://example.com/turkey/' + turkeyId),
    $http.get('http://example.com/fish/' + fishId),
    $http.get('http://example.com/dog/' + dogId)
    .then(function(response) {
         myData.dog = response.data;
         return $http.get('http://example.com/breed/' + response.data.breed_id);
     })
     .then(function(response) {
         myData.dog.breed = response.data;
         return $http.get('http://example.com/food/' + response.data.food_id);
     })
     .then(function(response) {
         myData.dog.food = response.data;
         return myData;
     })
])
.then(function(responses) {
    myData.cat = responses[0].data;
    myData.turkey = responses[1].data;
    myData.fish = responses[2].data;

    secondSetComplete = true;
    returnData();
});

对狗的那条大保证书最终会返回一个单独的保证书,当最后一个then被调用时,它会被解决,并由最终功能的结果来解决。因此,没有理由不能将其嵌套在$q.all()呼叫中。



 类似资料:
  • 我希望能够删除警报,但前提是此警报未分配给用户。为此,我需要获取我的用户列表,并检查是否没有用户分配了此警报。我通过将2个请求与可观察对象链接,成功地实现了这一点,但有更好的方法实现吗?

  • 我有一个Quarkus应用程序,它读取一个文件并发送请求(到另一个Quarkus微服务)。目前,我为文件的每一行发送一个请求。但这个过程花了这么长时间因为我有上千行。 我读过关于Vert.x的文章,我得到了一个对API的异步请求,这要感谢这个链接: https://quarkus.io/blog/mutiny-concurrent-uni/ 但我的问题是,我必须将请求的响应保存到一个数组中,最后保

  • 我试图用相同的观察者观察两个请求。我的: 我的请求是使用Reformation 2构建的登录请求: 现在我想启动2个或更多请求并在中逐个检查响应,当检查最后一个请求时,使用我的执行。有人能帮我吗? 提前致谢。

  • 我的后端应用程序在Spring启动和SSL保护。我用的是OAuth2脸书登录。也是Angular 7中的前端应用程序,并由SSL保护。我的问题是向我的Spring boot应用程序发送Angular请求。所有应用程序都是HTTPS。 附言。如果我将url添加到websecurity.Iglishing()中,所有工作都正常。也不安全我的后端。我认为安全和HTTPS请求有一些问题。多谢帮忙。

  • 问题内容: 所以我刚才正在使用jQuery的.load(),看来我们无法配置`$(“#example”).load(‘./uri.ext `$(“#example”).load(‘./uri.ext #ID1’).load(‘./uri.ext #ID2’).load(‘./uri.ext ID3’)` 如果我们具有DIV的模板文件或用于动态构建页面的文件,而不将HTML存储在字符串变量中或沿这些