Promise从AngularJS中的链接.then()函数返回的关系是什么

时间:2015-05-22 22:00:20

标签: javascript angularjs promise chain

所有

我对Promise很新,只是好奇他们如何得到解决,有一件事让我感到困惑:

有些帖子显示使用

var defer = $q.defer();

// some logic block
{
    // if success doing something
    defer.resolve();
}
return defer.promise;

但是如果使用.then()函数,则从.then(function(){})返回promise,我想知道如何控制这个promise是否已解决?

另一个令人困惑的是:如果我使用一些链接的.then()函数,我想知道它们之间的关系是什么,它们是相同的承诺对象,只是传递下来或每个。然后将生成一个新的Promise对象并返回它?

2 个答案:

答案 0 :(得分:1)

正如本文所述,明确document

问题1。我想知道如果这个承诺得到解决,我该如何控制呢?

其中一个Promise API支持resolve()reject()承诺的特殊功能。因此,您可以在代码中使用以下函数

var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything turned out fine */) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});

当承诺被明确拒绝时,也会发生拒绝,但也会隐含 如果在构造函数回调中抛出错误。

var jsonPromise = new Promise(function(resolve, reject) {
  // JSON.parse throws an error if you feed it some
  // invalid JSON, so this implicitly rejects:
  resolve(JSON.parse("This ain't JSON"));
});

jsonPromise.then(function(data) {
  // This never happens:
  console.log("It worked!", data);
}).catch(function(err) {
  // Instead, this happens:
  console.log("It failed!", err);
});

在其他变体中,使用传递给链中下一个链接的返回值来解析Promise。

问题2。

在某种意义上,承诺将导致未来具有某种价值。结果值是promise的返回值 - 所以基本上承诺链接(.then(...)。然后...)是等待上一个结束的函数链(用某个值解析)。然后使用参数调用它们,该参数是队列中最后执行的函数的返回值(链中的上一个链接)。

.then()返回一个新的promise对象,从而允许链接。 (参见文档链接备注)

<强> REMARK

Promise API部分Chaining the promises和下一部分<div class="item" ng-click="toogle()"></div> 下的所有Angular承诺都有很好的描述。

答案 1 :(得分:1)

这并不是试图以充分的荣耀来解释承诺 - 有博客就是这样。这是为了回答您的具体问题:

Q1:

  

但是如果我使用.then()函数,则从.then(function(){})返回promise,我想知道如果这个承诺得到解决,我该如何控制呢?

.then的解析处理函数控制如何解决此约定:

  1. 如果处理函数返回一个非promise值,那么promise将带有该值的resolve。
  2. var thenPromise = originalPromise.then(function success() {
       return "foo";
    });
    
    thenPromise.then(function(data){
       console.log(data); // "foo"
    });
    
    1. 如果处理函数返回另一个承诺,那么.then承诺将准确解决新承诺如何解决(或拒绝)
    2. var thenPromise = originalPromise.then(function() {
         return $timeout(function(){ return "foo"; }, 1000);
      });
      
      thenPromise.then(function(data){
         console.log(data); // (after 1 second) "foo"
      });
      
      1. 如果处理函数抛出异常或者返回是明确拒绝的promise $ $ q.reject:
      2. var thenPromise = originalPromise.then(function() {
           return $q.reject("some error");
        });
        
        thenPromise.then(function(data){
           console.log(data); // doesn't get here
        })
        .catch(function(err){
           console.log(err); // "some error"
        });
        

        <强> Q2:

          

        如果我使用一些链式.then()函数,我想知道它们之间的关系是什么,它们是相同的promise对象,只是传递下来或每个.then将生成一个新的Promise对象并返回它?

        每个.then都会产生自己的承诺。

        var timeoutPromise = $timeout(afterTimeout, 1000);
        var thenPromise = timeoutPromise.then(doSomething);
        var anotherThenPromise = timeoutPromise.then(doSomethingElse);
        

        如果timeoutPromise结算,那么doSomethingdoSomethingElse都会执行,并且根据其结果thenPromiseanotherThenPromise会有各自的解决方案。