2017-09-14 4 views
-1

비동기 적으로 수행하는 방법 console.log ("모든 후 완료 후 인쇄"각 루프마다 여러 삽입 기능을 대기/완료하는 방법은 무엇입니까?

나는 forEach forEach를 가지고있다.

InsertService는 값을 반환하지 않습니다. 여기에 삽입하고 싶습니다.

$ q 및 $ q.all을 적용하는 방법을 모르겠습니다. pls 도움이됩니다. 삽입()이 같은 것을 할 수있는 약속을 반환하는 경우

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"); 

      } 

답변

1

: 각 InsertService.Insert(value) 반환 약속 경우

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*/}); 
+0

myInsert는 어떤 값도 반환하지 않습니다. 단지 삽입하고 싶습니다. 삽입하고 싶으면 "ALL IS DONE"을 인쇄하고 싶습니다. –

+0

선생님, 내 질문을 편집하십시오. –

+0

@PauloDelaCruz Insert가 값을 반환하지 않으면 .then()을 사용할 수 없습니다. 그게 틀렸어? 이제는 selectID라는 호출이 있으며 약속을 반환해야합니다. – rjustin

1

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"); 
}); 

시도를 사용할 수 있습니다 this :

.

.

.

.

편집

나는 내가 이해하는 것은 여기, 당신이 원하는 예제 코드입니다 모르겠어요.

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

및 확인 fnTwo, fnThree, ... 등의 위.

그런 다음 아래와 같이 $ q.all을 사용할 수 있습니다. $q.all 어레이의 모든 기능을 실행 한 후 $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을 실행한다.

모든 기능이 자체 작업을 완료 한 후에 "모든 후"를 인쇄 할 수 있습니다.

아마도 내가 생각하는 데 도움이 될 수 있습니다.

+0

내 insertService는 sqllite에서 어떤 값도 반환하지 않으므로 콘솔을 사용하여 실제로 저장했는지 확인합니다. –

+0

선생님이 내 질문을 편집합니다. pls see. –

+0

@PauloDelaCruz'InsertService.Insert (value)'코드를 추가 할 수 있습니까? doc $ q에 대해 확인해야합니다. https://docs.angularjs.org/api/ng/service/$q –