2016-05-02 2 views
0

Я столкнулся с проблемой. У меня есть функция angularjs, которая, в свою очередь, вызывает другую функцию угловой функции, которая имеет пост-запрос. Этот запрос всегда срабатывает, когда заканчивается первая функция ... это не срабатывает по отдельности.Асинхронный код для последовательного выполнения

 servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{ 
      "date":d 
      }).then(function(result) { 
     console.log(result); 

     }); 

Пожалуйста, кто-нибудь объяснить мне это behaviour..any обходной путь для этого ... Я хочу, чтобы выполнить все запроса HTTP sequentially.how ли я implemet его в этот код? Заранее спасибо!

+0

Вы должны посмотреть на использование обещаний: http://www.dwmkerr.com/promises-in-angularjs-the-definitive-guide/ –

+0

hmmm ... я пришел к обещаниям ... теперь я запутался, чтобы реализовать код в моем вопросе с обещаниями ... любая помощь будет оценена –

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-do-i- return-the-response-from-a-асинхронный вызов) –

ответ

0

Как я понимаю из вашего вопроса, у вас есть страница, где один раздел зависит от другого раздела и т. Д. и все эти разделы обслуживаются/обрабатываются по-другому запросу-2.

В этом случае вы можете сделать второй запрос HTTP от успешного/разрешенного обратного вызова первого запроса HTTP и так далее. например

servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{ 
     "date":d 
     }).then(function(result) { 
    $scope.dcrlocked = result.dcrlocked; 
    $scope.leaves = result.leaves; 
    //$scope.holidays = result.holidays; 
    //make another http request as below. 
    servicePOST2.send(url,{data or data from last request}).then(function(){ 
      // make another http request. and so on. 
     }) 
    }); 

Поскольку все запросы HTTP делаются из успеха обратного вызова запроса последнего HTTP, он будет гарантировать последовательные запросы HTTP.

EDIT

вы можете использовать $promise в вашей второй функции, где вы звоните запрос пост. например

var deferred = $q.defer(); 
    servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{ 
     "date":d 
    }).then(function(result) { 
     $scope.dcrlocked = result.dcrlocked; 
     $scope.leaves = result.leaves; 
     //$scope.holidays = result.holidays; 
     deferred.resolve(result); 
    }); 
    return deferred; // return deferred from your function. 

Не забудьте ввести $ q в контроллер и передать его второй функции. Это заставит функцию post возвращаться синхронно. Дайте мне знать, если это то, что вы ищете.

+0

Я просто хочу, чтобы этот код выполнялся последовательно ... ничего более ... больше не было http-запросов в моем коде, кроме этого –

0

Это может помочь вам

var TestService = function($scope, servicePOST, AnotherService2, AnotherService3) 
    { 
     // Level 1 
     servicePOST 
      .send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{ 
      "date":d })// Request #1 
      .then(function(result)    // Response Handler #1 
      { 
       $scope.dcrlocked = result.dcrlocked; 
       // Level 2 
       AnotherService2        //AnotherService Call 
        .send({})  // Request #2 
        .then(function(result )    // Response Handler #2 
        { 
         $scope.leaves = result.leaves; 
         // Level 3 
         AnotherService3 
          .send({})  // Request #3 
          .then(function(result)   // Response Handler #3 
          { 
           //$scope.holidays = result.holidays; 
          }); 
        }); 
      }); 
    }; 
+0

отредактировал код в моем вопросе для простоты ... я хочу, чтобы этот фрагмент кода выполнялся suquently вместо того, чтобы он исполнялся в конце (например, как он себя ведет) ... используя обещания .... но я смущен, как реализовать MY-код с помощью обещаний .. .. любая помощь будет оценена –

+0

этот код выполняется в последовательном порядке. Для того, чтобы сделать асинхронный вызов в последовательном порядке, используются разные вызовы. В этом я включаю три службы, которые выполняют свои соответствующие функции. –

0

Короче вы не можете. Javascript не блокирует по дизайну, вам нужно взглянуть на обещания или реализовать вложенные обратные вызовы.

Смежные вопросы