如何角度承诺。然后工作

时间:2015-05-13 23:07:45

标签: angularjs promise

我是AngularJS $ q的新手并承诺,我知道如果我使用#include <QApplication> // <== this is important #include <QQmlApplicationEngine> #include <QDebug> // <= with the intention of testing #include <QScreen> // <== this is important #include <QDesktopWidget> // <== #include <QQmlContext> #include "globalcontrolclass.h" int main(int argc, char *argv[]){ QApplication app(argc, argv); QQmlApplicationEngine engine; GlobalControlClass controlGlobal; QRect z = qApp->desktop()->screenGeometry(); controlGlobal.setWindowHeight(z.height()); controlGlobal.setWindowWidth(z.width()); qDebug()<<"Window Dip-> H:"<<controlGlobal.windowHeight()<<"W:"<<controlGlobal.windowWidth(); if(z.height()<=0 || z.width()<=0){ qDebug()<<"Error al obtener tamaño de la pantalla.\nNo se puede continuar asi."; return false; } engine.rootContext()->setContextProperty("ControlGlobal", &controlGlobal); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ,我可以得到一个承诺,我可以使用它的$http.get()函数链接

.then

然后每个人都会返回一个新的承诺,但我的问题是我怎么知道然后已经解决了?我注意到的一件事是,如果我添加返回$http.get(url) .then(function(data){}, function(err){}) .then(function(data){}, function(err){}) ..... ,那么下一个函数可以从之前的函数获得返回值,那么这是否意味着我需要给出一个返回作为解析?

2 个答案:

答案 0 :(得分:1)

  

我怎么知道那时候已经解决了?

正如您所注意到的,then()返回的承诺在执行回调后解析(在第一个承诺完成时执行)。它确实解决了回调的结果。

  

我是否需要给予回报作为决心?

不,如果您没有return来自回调的任何内容,结果就是undefined - 就像常规函数调用一样。

但是,实际上你有更多选项来构建回调中的结果而不是返回一个普通值:

  • 你可以return另一个承诺。 then()返回的承诺将采用它,即履行其结果或在其结算后立即拒绝理由。
  • 您可以throw例外。它将自动被捕获,并且因此错误而拒绝生成的承诺。

答案 1 :(得分:0)

当第一个then的回调执行时,初始承诺已经解决,但您可以像您描述的那样链接thens。 每个then调用都会创建一个新的派生承诺。如果从then回调中返回具体值,则将使用该值解析派生的承诺。您将能够在随后的then回调

中将该值作为参数进行访问
serviceCall().then(function(){})//nothing returned => resolves with undefined value
             .then(function(){return 10;})//will resolves with the value 10
             .then(function(data){//data is 10 here
              });

基本上没有必要手动解决承诺。你也可以调用像其他$ http请求一样返回promises的外部函数。

serviceCall().then(function(){
  return $http.get('/get-customer-from-server');//returns customer
})
.then(function(customer){
  //the customer is available here
})

为简洁起见,我省略了错误回调。如果任何承诺被拒绝,将执行错误回调,这很可能是由于某处的失败。错误处理有一个简写符号。您可以使用catch

而不是使用两个回调
serviceCall().then(function(){
})
.catch(function(){//error handling if promise was rejected
}) 

catch是.then(null,function(){});

的别名

此处有更多信息:http://www.syntaxsuccess.com/viewarticle/angular-promise-chaining-explained