我正在编写一个基于Promise的angularjs应用程序,尽管它工作正常,但我想知道是否可以将其做得更好。
在代码的开头,我正在创建一个承诺,以获取一些数据。完成此操作后,我要运行几个都使用此数据的函数。这些功能附加在应用程序的无关部分上,因此我不知道将它们附加到Promise的顺序。它们也不需要依次执行。
app.service("Fetch", function ($q){
return function() {
var def = $q.defer();
somelibrary.asynccall(function(error, data){ //callback
if (error) def.reject(error);
else def.resolve(data);
});
return def.promise;
};
});
app.controller("ctrl", function ($scope, Fetch) {
var prom = Fetch();
//somewhere:
prom.then(function(data){$scope.var1 = data["VAR1"];});
//somewhere else:
prom.then(function(data){$scope.var2 = data["VAR2"]});
});
此处的主要缺点是,then
仅当前一个结束时才执行后一个s,在此没有必要。
另外,我需要return data
在每个中添加function(data){...}
,否则以下内容then()
将data
不可用。
没有其他方法可以更适合这种情况吗?
编辑:如@ jfriend00所述,我误会了;实际上,一旦成功解决了诺言,这两个功能便会并行运行,并且它们没有链接在一起,因此彼此之间不依赖。谢谢你的帮助
将我的评论变成答案,因为它似乎可以解决问题:
在您的模式下,.then()
对同一诺言的两个调用将在诺言被解决时一个接一个地被调用。第二个.then()
与最初的承诺无关,与第一个发生的事情无关.then()
。
这些没有链接,因此第二个.then()
不依赖于从第一个返回的内容,.then()
并且两者都将传递相同的数据。他们只是具有相同承诺的多个观察者,就像两个事件处理程序正在监听同一事件一样。
.then()
相同诺言的两个处理程序将按照它们附加到诺言的顺序被调用,并且都将传递相同的数据。
以获得更多关于 链 p.then(...).then(...)
与 分支的 信息p.then(...); p.then(...)
。
问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您
问题内容: 我必须做一个序列的承诺:我一次只有1个网址,这意味着只有1个诺言。每次我收到一个json时,其中一个都包含另一个json的网址,因此我必须做出另一个承诺。 我可以处理多个诺言,但是在这种情况下,我做不到,因为我没有所有的URL,只有一个。 这个例子不起作用,全部冻结。 问题答案: 您可以使用递归
问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()
问题内容: 我有一个使用$ resource的简单控制器: 我在指令中使用此控制器(在链接功能中) 但是区域是不确定的。调用是异步的,这很逻辑。 我的问题是我该如何等待结果和区域成为包含所有数据的数组? 这里指令的定义 问题答案: 如果要使用异步方法,则需要通过$ promise使用回调函数,示例如下:
问题内容: 我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸开并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果有其他问题,请
问题内容: 我对诺言仍然相当陌生,并且目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,例如,我在快速应用程序中有一个promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回50