对承诺对象的困惑

时间:2015-03-10 03:44:57

标签: javascript angularjs promise angular-promise

我已经读过关于promise对象的事实,并且事实上已经开发了promise对象,但我仍然必须说我对基础知识并不清楚。

$http.get('/someURL').then(function(response) {
// do something
}, function(error) {
});

人们说。然后返回一个promise对象。在上面的示例中,$ http.get()返回一个promise对象。那么这条线是什么意思呢?这是不是意味着prom.promise? (由.then返回的$ http.get()点承诺返回的promise对象?)

有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:4)

$http.get()返回一个承诺。然后,您可以就该承诺致电.then().then()还会再次承诺您未在代码中使用。

例如,你可以这样做:

var p = $http.get('/someURL').then(function(response) {
    // do something
}, function(error) {
    // do something on error
});

// p is a promise
p.then(function() {
    // more code here that runs after the previous code
});

或者,你可以这样做:

$http.get('/someURL').then(function(response) {
    // do something
}, function(error) {
    // do something on error
}).then(function() {
    // more code here
});

因此,每个.then()处理程序返回另一个承诺,因此您可以根据需要链接多次。一个特别有用的特性是,如果从.then()处理程序回调中返回一个promise,那么.then()处理程序已经返回的承诺将继承你从回调中返回的那个承诺:

$http.get('/someURL').then(function(response) {
    return $http.get('/someOtherURL');
}, function(error) {
    // do something on error
}).then(function(secondResponse) {
    // will get here when both http.get operations are done
});

答案 1 :(得分:2)

承诺的一个很酷的特点是它们可以链接在一起。 $ http.get()返回一个你已经调用了then的promise。然后,它也会返回一个承诺,并允许您在另一个声明中执行其他操作。例如:

function myGet() {
    return $http.get('myRoute').then(
        function(res) {
           //do something
           return res;
        }, function(err) {
           return $q.reject(err);
        });  
}

myGet().then(
    function(res) {
        //Do something else
    }, function(err) {
        //Handle Error
    });

如果你想在myGet函数成功或出错之后让程序发生,这非常方便。