Q.all问题,它不会等待所有承诺完成

时间:2016-02-28 11:37:39

标签: node.js promise q

我已经举了一个我用例的小例子,见下文(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))
  })

1 个答案:

答案 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/