【问题标题】:How angular promise .then works角度承诺 .then 是如何工作的
【发布时间】:2015-05-13 23:07:44
【问题描述】:

我是 AngularJS $q 和 promise 的新手,我知道如果我使用 $http.get(),我可以获得一个 promise,我可以像链式一样使用它的 .then 函数

$http.get(url)
     .then(function(data){}, function(err){})
     .then(function(data){}, function(err){})
     .....

每个 then 返回一个新的承诺,但我的问题是我怎么知道 then 已经解决了?我注意到的一件事是,如果我将 return 添加到 function(data){},下一个 then 函数可以从上一个 then 函数中获取该返回值,那么这是否意味着我需要将 return 作为解析?

【问题讨论】:

    标签: angularjs promise


    【解决方案1】:

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

    如您所见,then() 返回的承诺在回调执行后被解析(回调在第一个承诺完成时执行)。它确实会通过回调的结果来解决。

    我需要返回作为解决方案吗?

    不,如果您在回调中没有 return 任何内容,则结果为 undefined - 就像常规函数调用一样。

    但是,实际上,在回调中构建结果的选项比返回普通值要多:

    • 您可以return 另一个承诺。 then() 返回的 Promise 将采用它,即在它完成后立即履行其结果或拒绝其原因。
    • 您可以throw 异常。它将被自动捕获,并且生成的 Promise 会因该错误而被拒绝。

    【讨论】:

      【解决方案2】:

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

      基本上不需要手动解决promise。你也可以像其他 $http 请求一样调用返回 Promise 的外部函数。

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

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

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

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

      更多信息在这里:http://www.syntaxsuccess.com/viewarticle/angular-promise-chaining-explained

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多