2016-02-28 89 views
0

我已经把我的用例的一个小例子,见下面(的jsfiddle:https://jsfiddle.net/BWNba/165/):问题与Q.all,它不会等待所有承诺完成

基本上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

Q.all接受一个阵列承诺,并返回无极如果所有的承诺都解决了,或者如果它们中的一个被拒绝拒绝被解决。您的电话Q.all(promise, promise, promise)无效。它必须是Q.all([promise, promise, promise])

退回的承诺通过承诺的结果数组解决,在您的情况下它将是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/

+0

好像这个作品中的jsfiddle。但在我的节点应用程序中不会。我的电话是sql查询的地方... – Sid

+0

然后我们需要看到原始代码,因为可能你的例子并不是你正在做的事情的正确类比。这些SQL查询是否有承诺? –

+0

是的,他们是承诺。 – Sid