2014-06-10 2 views
1

J'ai une chaîne de promesses qui doit appeler $http à mi-chemin de la chaîne et transmettre la promesse qui en résulte au prochain manieur. Le problème est mon .then() fonction de succès semble être envelopper la promesse $http retourné dans une autre promesse, résultant de ma promesse http étant traitée comme une charge utile. Donc, quand il se résout dans le prochain lien dans la chaîne, je reçois une promesse plutôt que la réponse http.

var statusPromise = Auth.getUserStatus(); 

var tokenPromise = statusPromise.then(function(status) { 
    if (status && status.accesstoken) { 
     return status.accesstoken; 
    } else { 
     return null; 
    } 
}); 

var httpPromise = tokenPromise.then(function(accesstoken) { 
    console.log('access token', accesstoken); 
    var params = { 
     page: page, 
     limit: limit 
    }; 

    if (accesstoken) { 
     params.accesstoken = accesstoken; 
    } 

    return $http.get(apiUrl + 'scenes/' + filter + '/', { 
     data: $.param(params), 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
    }); 
}); 

var doMoreStuffPromise = httpPromise.then(function(response) { 
    console.log(response); // this logs the promise as the payload, not the http response 
    return response.data; 
}); 

return doMoreStuffPromise; 

Comment puis-je enchaîner la promesse $http dans ma chaîne?

Répondre

1

J'ai trouvé le problème. Cela se passait beaucoup plus loin que prévu. Il se trouve que mon service Auth avait un bug:

this.getUserStatus = function() { 
    $.when(...); // woops, no $q 
}; 

aurait dû être:

this.getUserStatus = function() { 
    $q.when(...); 
}; 

J'ai accidentellement oublié $q et depuis $.when() est une fonction jQuery légitime pour créer des promesses, rien n'a pur et simple. Cependant, en raison des légères différences dans la façon dont les promesses angulaires et jquery fonctionnent, on a enveloppé l'autre au lieu de déballer.

+0

Intéressant. Je n'ai jamais vu ce problème dans la nature, et je l'avais considéré comme purement théorique :-) – Bergi

1

$http Les appels renvoient des promesses, et des promesses s'assimilent récursivement ... le problème n'est pas avec des promesses. Le problème est avec l'API $http en particulier. En fait, il est tout à fait impossible pour une implémentation de Promises/A + comme $ q de retourner un thenable sans le déballer.

Si vous utilisez .then (dans le cas de succès), il agit d'une manière différente que si vous utilisez .success, en dehors de .success pas enchaînant, il resolves with .data:

Votre code doit faire la même chose:

var doMoreStuffPromise = httpPromise.then(function(rep) { 
    console.log(resp.data); // now, your actual data 
    return resp.data; 
}); 
+0

C'est ce que j'ai fait, je viens de nommer la variable de callback transmise 'data' dans mon cas. Si je fais ce que vous suggérez, 'resp' est toujours une promesse qui a été enveloppée par le précédent' tokenPromise.then() '. Une promesse en tant que charge utile dans une autre promesse. – Soviut

+0

J'ai également mis à jour le code dans ma question pour illustrer ceci plus clairement avec une nomenclature moins ambiguë. – Soviut

+0

J'ai réservé cette réponse parce que vos remarques sur les implémentations de Promises/A + sont plus correctes que je ne le pensais. Les promesses JQuery ne sont pas A + et ne se déroulent PAS, d'où le comportement similaire, mais enveloppé. – Soviut

Questions connexes