你如何以非静态形式使用Q.all?

时间:2014-05-19 15:27:10

标签: javascript asynchronous promise q

我正在编写JavaScript API。 API返回与Kris Kowal(& contributors')Q promises库一起创建的承诺。在大多数情况下,我似乎无法在应用程序本身中引用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()?

2 个答案:

答案 0 :(得分:2)

  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;
    })

答案 1 :(得分:1)

承诺都是关于链接价值观的。写一个非静态all就像你要求的那样在这种背景下没有多大意义*。你在这里链着什么?你是如何使用这个价值的?最重要的是?如果JS不是在函数中而是在最外层范围内,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