【问题标题】:How to resolve $q.all?如何解决 $q.all?
【发布时间】:2014-06-24 21:13:56
【问题描述】:

我有 2 个函数,都返回承诺:

    var getToken = function() {

        var tokenDeferred = $q.defer();         
        socket.on('token', function(token) {
            tokenDeferred.resolve(token);
        });
        //return promise
        return tokenDeferred.promise;
    }

    var getUserId = function() {
        var userIdDeferred = $q.defer();
        userIdDeferred.resolve('someid');           
        return userIdDeferred.promise;
    }

现在我有一个主题列表,我想在这两个承诺得到解决后立即更新

    var topics = {      
        firstTopic: 'myApp.firstTopic.',  
        secondTopic: 'myApp.secondTopic.',
        thirdTopic: 'myApp.thirdTopic.',
        fourthTopic: 'myApp.fourthTopic.',
    };

已解决的主题应如下所示myApp.firstTopic.someid.sometoken

var resolveTopics = function() {
    $q.all([getToken(), getUserId()])
    .then(function(){

        //How can I resolve these topics in here?

    });
}

【问题讨论】:

  • 它们将在您的评论执行之前/之后通过时间码来解决。 docs.angularjs.org/api/ng/service/$q#all你是问如何从每个获取返回的数据吗?上述链接的文档中也对此进行了回答。第一个参数将是一个数组,其值表示承诺的解决方法。
  • 很抱歉我会编辑。我在问如何使用 getToken() 和 getUserId() 返回的值更新topics
  • 主题与从 getToken 和 getUserId 承诺返回的数据有何关系?
  • myApp.firstTopic.someid.sometoken

标签: javascript angularjs asynchronous q


【解决方案1】:

$q.all 创建一个 Promise,当您传递给它的所有 Promise 都被解决或被拒绝时自动解决,任何个 Promise 被拒绝。

如果你像你一样向它传递一个数组,那么处理成功解析的函数将收到一个数组,其中每个项目都是相同索引的承诺的解析,例如:

  var resolveTopics = function() {
    $q.all([getToken(), getUserId()])
    .then(function(resolutions){
      var token  = resolutions[0];
      var userId = resolutions[1];
    });
  }

我个人认为传递all 一个对象更具可读性,这样您就可以在处理程序中获得一个对象,其中值是相应承诺的分辨率,例如:

  var resolveTopics = function() {
    $q.all({token: getToken(), userId: getUserId()})
    .then(function(resolutions){
      var token  = resolutions.token;
      var userId = resolutions.userId;
    });
  }

【讨论】:

  • 即使我的问题不清楚,但你已经解决了。谢谢
  • 很高兴能帮上忙。
  • 仅供参考,库 q 和 $q 不一样。从 q 版本 1.4.1 开始,q.all() 不接受对象。 However, $q does accept objects.
猜你喜欢
  • 1970-01-01
  • 2013-12-29
  • 2014-10-07
  • 2017-08-04
  • 2013-04-25
  • 2018-03-08
  • 2015-04-09
  • 2015-06-23
  • 2018-03-17
相关资源
最近更新 更多