gpt4 book ai didi

angularjs - 正确链接 Angular $http 调用吗?

转载 作者:行者123 更新时间:2023-12-02 19:21:06 25 4
gpt4 key购买 nike

我已经阅读了好几天有关 $q 和 Promise 的内容,我似乎有点理解它了……。我在实践中遇到以下情况:

  1. 发出 $http 请求并检查是否可以进行后续调用。
  2. 如果第一次调用失败,则返回“无数据”,如果成功并表示可以进行调用,则进行第二次调用,如果没有成功,则再次返回“无数据”。如果第二次调用成功,则返回数据,否则返回“无数据”。它看起来像这样(大概是这样,我为了总体思路进行了简化,所以不要担心这里的小错误):

            return $http.get (something)
    .then(function(allowedAccess){
    if(allowedAccess){
    return $http.get (somethingElse)
    .then( function(result){return {data:result} },
    function(error){return {data:"n0pe"} }
    )
    } else {
    return {data:"n0pe"}
    }
    },
    function(){ return {data:"n0pe"} });

我被告知在这里使用 $q 。我真的不明白我会如何或为什么会这样做。 $http 调用已经是 promise 。

如果有办法让这个更干净,我看不到。刚刚重读完这篇文章post on the subject 。本质上,我错过了什么/有更好的方法来做到这一点吗?

编辑:也只需重新阅读 a tutorial on chaining promises - 它根本不处理调用失败。基本上将其发布为尽职调查。

编辑2:这更多的是对我所询问的理论的详细阐述,摘自第一篇文章:

This is a simple example though. It becomes really powerful if your then() callback returns another promise. In that case, the next then() will only be executed once that promise resolves. This pattern can be used for serial HTTP requests, for example (where a request depends on the result of a previous one):

这似乎是在谈论这样的链:

   asyncFn1(1)
.then(function(data){return asyncFn2(data)})
.then(function(data){return asyncFn3(data)})

所以,如果我理解正确的话,a)。不适用于我,因为我没有第三个功能。 b).如果我有三个函数,则适用于我,因为当我在第一个 $http 请求内运行 if 语句时,并且只有在 if 语句内我才会返回另一个 promise 。那么,从理论上讲,如果我要链接三个异步函数,我需要将 if 语句放在 Promise 中吗?

最佳答案

Promise 确实有助于编写异步调用的代码。换句话说,它们允许您以与编写一组同步调用类似的方式编写代码(使用链式 .then),就好像同步代码是在 try/catch block 中(使用 .catch)。

因此,假设您的 HTTP 调用被阻塞 - 您的逻辑如下所示:

var allowedAccess, data;
try {
allowedAccess = $http.get(something);

if (allowedAccess){
try{
var result = $http.get(somethingElse);
data = {data: result};
} catch (){
data = {data: "n0pe"};
}
} else {
data = {data: "n0pe"};
}
} catch (){
data = {data: "n0pe"};
}
return data;

你可以简化一下:

var allowedAccess, result;
try {
allowedAccess = $http.get(something);
var result;
if (allowedAccess) {
result = $http.get(somethingElse);
} else {
throw;
}
data = {data: result};
} catch () {
data = {data: "n0pe"};
}
return data;

这将转换为异步版本:

return $http
.get(something)
.then(function(allowedAccess){
if (allowedAccess){
return $http.get(somethingElse);
} else {
return $q.reject(); // this is the "throw;" from above
}
})
.then(function(result){
return {data: result};
})
.catch(function(){
return {data: "n0pe"};
})

至少,这是您在使用分支和异步调用编写代码时可以应用的推理。

我并不是说我提供的版本是最佳的或更短 - 它,但是,由于单个错误处理而更加干燥。但要意识到,当您执行 .then(success, error) 时,它相当于对之前的异步操作进行 try/catch - 这可能或者根据您的具体情况可能不需要。

关于angularjs - 正确链接 Angular $http 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com