我在这里放了一些示例代码来说明问题: http://jsfiddle.net/HB7LU/18216/
所以基本上,我期待console.log('输出成员'数据+号码);每次点击成员项后,mySvc.get()休息调用结束后立即执行。
$q.all([
mySvc.get({id: number})
]).then(function() {
console.log('out put data for member ' + number);
});
但事实并非如此,只有在您第一次点击它时它才能正常工作。第二次点击它,相反的情况发生。
XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=1"
(index):53 loading data - rest call finished
(index):68 out put data for member 1 <- this is correct
(index):68 out put data for member 2 <- this is wrong, should wait till rest call finishes
XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=2
(index):53 loading data - rest call finished
ps:我用chrome测试过它。没有在其他浏览器中测试它
请让我知道如何解决它。谢谢!
答案 0 :(得分:0)
你每次都返回相同的延迟而不是创建一个新的,如果你在get调用中移动了deferred的创建,或者只是从$ http调用中返回了promise,它可以正常工作
myService.get = function(requestParams) {
var deffered = $q.defer();
答案 1 :(得分:0)
每次调用.get()时都需要创建一个新的延迟。请参阅更正的代码。因为您只能解决延期一次,所以您多次解决它没有事件。它只是第一次解决它。在那之后,只要它返回该promise,它就会立即触发.then,因为deferred已经解决了。
myService.get = function(){
var deffered = $q.defer();
答案 2 :(得分:0)
其他解决方案是返回$ http创建的承诺(首先放回回调然后返回承诺):
myService.get = function(requestParams) {
var call = $http({
method: 'GET',
url: TEST_DATA_URLS,
params: requestParams
});
call.success(function (msg) {
console.log('loading data - rest call finished');
});
return call;
};
当你调用mySvs.get时,你有同样的承诺:
mySvc
.get({id: number})
.then(function() {
console.log('out put data for member ' + number);
});