如何执行Parent&按顺序查看子请求

时间:2017-07-17 09:26:23

标签: angularjs ajax angular-promise

如何将子请求添加到promise数组。我需要同步执行mutliple ajax请求。

在谷歌搜索中,我开始知道如何使用$q

    function _SearchData() {
    var promises = [];
    var callbackFunc = function(data) {
        dataService.get("https://childrequest").then(function(data) {
            console.log('inner ' + i);
        });
    }
    for (var i = 0; i < 5; i++) {
        promises.push(dataService.get("https://parentrequest").then(callbackFunc));
    }
    $q.all(promises).then(function(done) {
    })
};

这确保https://parentrequest在序列中执行,但https://childrequest仍未按顺序执行。

这会将输出呈现为

Parent #0
Parent #1
Parent #2
Parent #3
Parent #4

Child #0
Child #1
Child #3
Child #2
Child #4
Child #5

但我想要执行请求的是

Parent #0
Child #0
Parent #1
Child #1
Parent #2
Child #2
Parent #3
Child #3
Parent #4
Child #4
Parent #5
Child #5

展望未来,我尝试了以下方法但仍然似乎没有渲染

function _SearchData() {

var promises = [];

var callbackFunc = function(data) {
    utilService.test("https://parentrequeste").then(function(data) {
        if(data.entity == "Parent") //first check
        {
        console.log("outer  " + i);
         if(data.id > 0) // second check{
        utilService.get("https://childrequest").then(function(data) {
            console.log('inner ' + i);
         })
         }
         else 
         {
            utilService.create("https://childrequest").then(function(data) {
            console.log('inner ' + i);
          });
         }

         }});});}


for (var i = 0; i < 5; i++) {
    promises.push(callbackFunc);
}

$q.all(promises).then(function(done) {

});}

任何帮助/建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

始终在每个promise回调函数中返回一些内容

试试这个:

function _SearchData() {
    var promises = [];
    for (var i = 0 ; i < 5; i++) {
        var p = dataService.get("https://parentrequest").then(function() {
            // A return here:
            return dataService.get("https://childrequest").then(function (data) {
                console.log('inner ' + i);
                return data;  // A return here
            });
        });
        promises.push(p);
    }
    return Promise.all(promises);
}

//更新(添加一些条件):

function _SearchData() {
    var promises = [];
    for (var i = 0 ; i < 5; i++) {  
        var p = utilService.test("https://parentrequeste").then(function(data) {
            if(data.entity == "Parent") {
                console.log("outer  " + i);
                if(data.id > 0) {
                    return utilService.get("https://childrequest").then(function(data) {
                        console.log('inner ' + i);
                        return data;
                    })
                } else {
                    return utilService.create("https://childrequest").then(function(data) {
                        console.log('inner ' + i);
                        return data;
                    });
                }
            }
            return null;
        });
        promises.push(p);
    }
    return Promise.all(promises);   
}

答案 1 :(得分:0)

你可以做这样的事情来获得所需的输出模式。

function callParent(i, n) {
    if (i > n) {
        return;
    }
    console.log("call" + i);
    parent().then(function() {
        callParent(++i, n);
    })
}

function child() {
    var defer = $q.defer();
    $http.get("https://childrequest").then(function(res1) {
        console.log("Got child data");
        defer.resolve("Got child data");
    })
    return defer.promise;
}

function parent() {
    var defer = $q.defer();
    $http.get("https://parentrequest").then(function(res1) {
        console.log("Got Parent data");
        child().then(function() {
            defer.resolve("Got Parent data");
        })
    })
    return defer.promise;
}
var n = 10;
callParent(1, n);

工作演示http://jsfiddle.net/rmu6wuo8/1/