我正在编写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()?
答案 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
)