Javascript 承诺对象的混淆

Javascript 承诺对象的混淆,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我读过关于promise对象的书,实际上我也研究过promise对象,但我必须说我还不清楚基本原理 $http.get('/someURL').then(function(response) { // do something }, function(error) { }); 人们这样说。然后返回一个承诺对象。在上面的示例中,$http.get()返回一个promise对象。那么这条线是什么意思呢?这是不是意味着承诺,承诺??(promise对象由$http.get()返回,点promise由

我读过关于promise对象的书,实际上我也研究过promise对象,但我必须说我还不清楚基本原理

$http.get('/someURL').then(function(response) {
// do something
}, function(error) {
});
人们这样说。然后返回一个承诺对象。在上面的示例中,$http.get()返回一个promise对象。那么这条线是什么意思呢?这是不是意味着承诺,承诺??(promise对象由$http.get()返回,点promise由.then返回)

谁能澄清一下吗?

$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()
处理程序回调返回承诺,那么
.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
});
$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()
处理程序回调返回承诺,那么
.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
});

承诺的一个很酷的特点是它们可以联系在一起。$http.get()返回一个承诺,您调用了该承诺,然后打开。这也会返回一个承诺,并允许您在另一个then语句中执行其他操作。例如:

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函数成功或出现错误后执行一个过程,这将非常方便。

promises的一个很酷的功能是可以将它们链接在一起。$http.get()返回一个承诺,您调用了该承诺,然后打开。这也会返回一个承诺,并允许您在另一个then语句中执行其他操作。例如:

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函数成功或出现错误后执行一个过程,这将非常方便。

谢谢。我想我现在明白它的意思了。我的另一个问题是,var p的初始值是多少??它是在http get请求之前由$http.get()返回的空json,之后被实际响应对象覆盖吗?
p
是一个承诺对象。它最初处于
pending
状态(尚未解析,并且还没有内部值)。然后,当http操作完成时,它们
解析
承诺,并移动到
已实现
状态,调用其
。然后()
处理程序并将解析值传递给它们。Promise是带有方法和一些内部状态的对象。@DilipBS您可以想象这样的Promise。我将运行一个http请求,该请求将在一段时间后完成。因此,我得到一个bucket,并指示http请求在完成后将其结果存放在bucket中。我告诉任何局外人,如果他们想知道http请求何时完成,那么就向bucket注册,当结果完成时,bucket会调用您。然后我告诉bucket,当http响应被放入bucket时,它应该调用每个请求通知的外部人员,并将放入的响应传递给它。bucket是一种承诺。@DilipBS-cont'd-
。然后()
处理程序是注册bucket通知的方式。这真是太棒了。你进一步的解释帮助我理解了很多。谢谢。我想我现在明白它的意思了。我的另一个问题是,var p的初始值是多少??它是在http get请求之前由$http.get()返回的空json,之后被实际响应对象覆盖吗?
p
是一个承诺对象。它最初处于
pending
状态(尚未解析,并且还没有内部值)。然后,当http操作完成时,它们
解析
承诺,并移动到
已实现
状态,调用其
。然后()
处理程序并将解析值传递给它们。Promise是带有方法和一些内部状态的对象。@DilipBS您可以想象这样的Promise。我将运行一个http请求,该请求将在一段时间后完成。因此,我得到一个bucket,并指示http请求在完成后将其结果存放在bucket中。我告诉任何局外人,如果他们想知道http请求何时完成,那么就向bucket注册,当结果完成时,bucket会调用您。然后我告诉bucket,当http响应被放入bucket时,它应该调用每个请求通知的外部人员,并将放入的响应传递给它。bucket是一种承诺。@DilipBS-cont'd-
。然后()
处理程序是注册bucket通知的方式。这真是太棒了。你进一步的解释帮助我了解了很多。