在承诺完成之前执行的.then函数中的angular js代码

时间:2015-10-06 23:32:30

标签: angularjs

嗯,我坚持了一段时间,希望我能从你们那里得到一些提示。

我在这里放了一些示例代码来说明问题: 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测试过它。没有在其他浏览器中测试它

请让我知道如何解决它。谢谢!

3 个答案:

答案 0 :(得分:0)

你每次都返回相同的延迟而不是创建一个新的,如果你在get调用中移动了deferred的创建,或者只是从$ http调用中返回了promise,它可以正常工作

myService.get = function(requestParams) {
    var deffered = $q.defer();

http://jsfiddle.net/jc04arnn/

答案 1 :(得分:0)

每次调用.get()时都需要创建一个新的延迟。请参阅更正的代码。因为您只能解决延期一次,所以您多次解决它没有事件。它只是第一次解决它。在那之后,只要它返回该promise,它就会立即触发.then,因为deferred已经解决了。

myService.get = function(){
    var deffered = $q.defer();

http://jsfiddle.net/8qLrnz5o/

答案 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);
      });

这是小提琴: http://jsfiddle.net/tmbs0b1L/