【问题标题】:How Do You Use Q.all In Non-Static Form?您如何以非静态形式使用 Q.all?
【发布时间】:2014-05-19 15:27:09
【问题描述】:

我正在编写一个 JavaScript API。 API 返回使用 Kris Kowal(和贡献者)的 Q Promise 库创建的 Promise。在大多数情况下,我似乎不必在应用程序本身中引用 Q,这是我喜欢的,因为它使我选择的 Promises-library 对使用我的 API 进行开发的人来说是透明的。 (到目前为止)我似乎遇到问题的唯一方法是Q.all()

Q API 参考声明“此方法通常以其静态形式使用”。是否可以以非静态形式(或其他形式)使用 Q.all() 以便我不需要引用 Q?

例如按系列获取人员和工作(我不想要系列。虚构的示例):

MyApplication.prototype.renderTeam = function(name) {

  var that = this;

  myAPI
    .getTeam({name: name})
    .then(function(data) {
      that.team = data;
    })

    // list of all people
    .then(function() {
      return myAPI.getPeople();
    })
    .then(function(data) {
      that.people = data;
    })

    // list of all jobs
    .then(function(data) {
      return myAPI.getJobs();
    })
    .then(function(data) {
      that.jobs = data;
    })

    // render template
    .then(function() {
      var template = $('#template'}.html();
      var content = Mustache.render(template, {
        team: that.team,
        people: that.people,
        jobs: that.jobs
      })
      $('#view').html(content);
    })
    .fail(function(err) {
      alert(err.message);
    })
  ;
};

我想使用 .all 和 .spread(或任何其他方式)并行获取所有人员和工作,但不参考 Q,但这不起作用:

MyApplication.prototype.renderTeam = function(name) {

  var that = this;

  myAPI
    .getTeam({name: name})
    .then(function(data) {
      that.team = data;
    })

    // list of all people and jobs.
    // broken here.
    .all([
      myAPI.getPeople(),
      myAPI.getJobs()
    ])
    .spread(function(people, jobs) {
      that.people = people;
      that.jobs = jobs;
    })

    // render template
    .then(function() {
      var template = $('#template'}.html();
      var content = Mustache.render(template, {
        team: that.team,
        people: that.people,
        jobs: that.jobs
      })
      $('#view').html(content);
    })
    .fail(function(err) {
      alert(err.message);
    })
  ;
};

有没有正确的方法来完成这个?是否必须添加 API 方法 getAll()?

【问题讨论】:

    标签: javascript asynchronous promise q


    【解决方案1】:
      myAPI
        .getTeam({name: name})
        .then(function(data) {
          that.team = data;
          return [
            myAPI.getPeople(),
            myAPI.getJobs()
          ];
        })
        .all()
        .spread(function(people, jobs) {
          that.people = people;
          that.jobs = jobs;
        })
    

    【讨论】:

    • 大声笑,恭喜您接受。当之无愧的答案可以解释很多并正确使用.all:D
    • 谢谢!这对我有用:此代码中的任何地方都没有“Q”。多亏了@benjamin-gruenbaum 的评论,我什至能够完全放弃 .all(),只依赖 .spread()。
    【解决方案2】:

    Promise 都是关于链接值的。像您要求的那样编写非静态all 在这种情况下没有多大意义*。你在这儿拴什么?你是如何使用价值的?最重要的是?考虑到代码不在函数中而是在最外层范围内,JS 如何不立即评估该代码?

    这使得没有函数参数的非静态.all 无法实现您想要完成的任务。文档在这里有点不准确。写你想要的正确方法是:

     myAPI
        .getTeam({name: name})
        .then(function(data) {
          that.team = data;
          return Q.all([
            myAPI.getPeople(),
            myAPI.getJobs()]);
        ])
        .spread(function(people, jobs) {
          that.people = people;
          that.jobs = jobs;
        })
    

    *其他较新的库(如 Bluebird)中存在的 all 的非静态版本做了一些完全不同的事情(确保 .map 等某些操作中的顺序)

    【讨论】:

    • Q .all 和 bluebird .all 做同样的事情
    • @Esailija 蓝鸟没有非静态变体吗?
    • 和你的一样哦
    • 酷,有一个 +1,虽然我永远不会那样写代码,而且,.all 是毫无意义的,因为传播:P
    • 因为.all 不像其静态形式那样明确,所以您没有立即解决的数组上的承诺,您突然等待每个数组元素解析,您有一个数组你等待的承诺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多