如何为每个循环等待/完成多个插入功能?

时间:2017-09-14 01:16:34

标签: angularjs sqlite insert promise angular-promise

如何异步执行此操作,打印console.log(“PRINT THIS,所有循环完成后”)

我每个人都在forEach。

InsertService不会返回任何值,我只想在此处插入。

我不知道如何申请$ q和$ q.all。请帮助。

   angular.forEach(MAIN, function (value, key) {

          //#1
         SelectService1.SelectID(value.id).then(function (res) {
             angular.forEach(res, function (value, key) {

              InsertService1.Insert(value).then(function (res) {
                  console.log("NEW INSERTED Service 1!");
                },
                function (err) {
                });

             });
          },
            function (err) {
           });

           //#2
         SelectService2.SelectID(value.id).then(function (res) {
             angular.forEach(res, function (value, key) {

              InsertService2.Insert(value).then(function (res) {
                  console.log("NEW INSERTED Service 2!");
                },
                function (err) {
                });

             });
          },
            function (err) {
           });


           //#3
         SelectService3.SelectID(value.id).then(function (res) {
             angular.forEach(res, function (value, key) {

              InsertService3.Insert(value).then(function (res) {
                  console.log("NEW INSERTED Service 3!");
                },
                function (err) {
                });

             });
          },
            function (err) {
           });
     });
               //
               console.log("PRINT THIS, AFTER ALL LOOP IS DONE");

            }

2 个答案:

答案 0 :(得分:1)

如果Insert()返回一个promise,你可以这样做:

var inserts = [];
inserts.push(InsertService1.Insert(value));
inserts.push(InsertService2.Insert(value));
inserts.push(InsertService3.Insert(value));

$q.all(inserts).then(()=>{/*once all have finished*/});

答案 1 :(得分:1)

如果每个InsertService.Insert(value)都返回承诺,

你可以用这个

var res1 = InsertService1.Insert(value).then( function (res) {
    console.log("NEW INSERTED Service 1!");
}, function (err) {
    console.log("error here");
});

var res2 = InsertService2.Insert(value).then( function (res) {
    console.log("NEW INSERTED service 2 !");
}, function (err) {
    console.log("error here");
});

var res3 = InsertService3.Insert(value).then( function (res) {
    console.log("NEW INSERTED service 3");
}, function (err) {
    console.log("error here");
});

$q.all([res1, res2, re3]).then(function(results){

    console.log(results[0]);   //  this returns promise of res1;
    console.log(results[1]);   //  this returns promise of res2;
    console.log(results[2]);   //  this returns promise of res3; 

    console.log("PRINT THIS, AFTER ALL LOOP IS DONE");
});

试试这个:)

修改

我不确定我理解的是你想要的,这里是一个示例代码。

function fnOne(param1, param2, ...) {
    return $q(function (resolve, reject) {

       // you can do anything what you want in here
       // and just put success value or error value in resolve or reject

       if(success){
           // result of your code is successful
           resolve(success value);     // this success value will call in $q.all();
       } else {
           // result of your code is failed
           reject(failed value);
       }
    });
}

并制作fnTwofnThree,......如上所述。

然后您可以使用$ q.all,如下所示。

$q.all([
    fnOne(
        param1,
        param2,
        ...
    ),
    fnTwo(
        param1,
        param2,
        ...
    ),
    ...
]).then(function (response) {
    // response[0] returns promise of fnOne()
    // response[1] returns promise of fnTwo()
    ....

   console.log("PRINT THIS, AFTER ALL LOOP IS DONE");
});
执行then数组的所有函数后,$q.all执行{p> $q.all

你可以打印"打印这个,在所有循环完成后#34;在所有功能完成自己的工作之后。

也许这可以帮助你。