我已经举了一个我用例的小例子,见下文(jsfiddle:https://jsfiddle.net/BWNba/165/):
基本上Q.all只有在首先处理最大的工作时才能正常工作。我在这里有什么可以让它正常工作吗?
function findPersonWithId(id) {
var deffered = Q.defer();
setTimeout(function(){
var newPerson = {id: 123}
deffered.resolve(newPerson)
},300)
return deffered.promise;
}
function loadHobbies(person) {
var deffered = Q.defer();
setTimeout(function(){
person.hobbies = ['programming', 'surfing', 'cooking']
deffered.resolve(person)
},100)
return deffered.promise;
}
function loadAddress(person) {
var deffered = Q.defer();
setTimeout(function(){
person.address = 'Melbourne, Australia'
deffered.resolve(person)
},200)
return deffered.promise;
}
function loadPersonalDetails(person) {
var deffered = Q.defer();
setTimeout(function(){
person.name = 'Bob'
person.age = 99
person.gender = 'male'
deffered.resolve(person)
},300)
return deffered.promise;
}
function loadRand(person) {
var deffered = Q.defer();
var rand = ~~(Math.random() * 1000)
setTimeout(function(){
person[rand] = rand
deffered.resolve(person)
},rand)
return deffered.promise;
}
function getPersonChain() {
return findPersonWithId(123)
.then(loadHobbies)
.then(loadAddress)
.then(loadPersonalDetails)
}
function getPersonQAllSmFirst() {
return findPersonWithId(123)
.then(function(person){
return Q.all(
loadHobbies(person),
loadAddress(person),
loadPersonalDetails(person)
)
})
}
function getPersonQAllLgFirst() {
return findPersonWithId(123)
.then(function(person){
return Q.all(
loadPersonalDetails(person),
loadHobbies(person),
loadAddress(person)
)
})
}
getPersonChain()
.done(function(person){
$('.person').append(JSON.stringify(person))
})
getPersonQAllSmFirst()
.done(function(person){
$('.person2').append(JSON.stringify(person))
})
getPersonQAllLgFirst()
.done(function(person){
$('.person3').append(JSON.stringify(person))
})
答案 0 :(得分:1)
Q.all
接受承诺数组并返回Promise,如果所有承诺都被解决或被拒绝,则会解析Promise。
您对Q.all(promise, promise, promise)
的来电无效。它必须是Q.all([promise, promise, promise])
。
返回的承诺通过promises中的一系列结果解决,在您的情况下,它将是3个相同的人。
小例子(将1,2,3打印到控制台):
Q.all([
Promise.resolve(1),
Promise.resolve(2),
Promise.resolve(3)
]).then(function(numbers) { console.log(numbers); };
要使其正常运行,您需要更改代码,例如https://jsfiddle.net/g8sgqrof/