2016-06-20 2 views
0

У меня есть список объектов видео, у каждого объекта есть ссылка и несколько других атрибутов. Я построил цикл, который проходит через этот список и загружает эти видео по их ссылкам, служба, которую я использую в настоящее время, не поддерживает одновременную загрузку нескольких видеороликов, мне нужно подождать 1-го видео для загрузки после этого. нужен 2-й, чтобы загрузить ..etc

Вот код отвечает за это:

$scope.upload = function(){ 
    $scope.videoList.forEach(function(video){ 
     video.state = "Downloading" 
     $scope.msg = "The video is downloading" 
    $http.post("/download",{link : video.link,title : video.title}).then(function(resp){ 
     $scope.msg = "The video has been downloaded on the server, it will now start uploading" 
     var filen = resp.data["fn"] 
     var title = resp.data["title"] 
     video.state = "Uploading" 
     $http.get("/uploadVid?file=" + filen +"&title=" + title).then(function(resp){ 
     if (resp.data == "0002"){ 
     alert("You didn't authorize the App yet, please authorize it to be able to use it .") 
     } 
     if (resp.data == "000X"){ 
     alert("An error occured, please retry .") 
     } 
     else{ 
     $scope.msg = "the video uploaded, here's the link: " + resp.data 
     video.state = "Done" 
     video.link = resp.data 
     } 
     }) 
    }) 

    }) } 

что здесь происходит, что для каждого видео мы загружаем его на сервер после того, как он загружен, он загружен на услугу видеохостинга (в нашем случае - YouTube). Это должно сработать нормально, но из-за асинхронного вызова служебных вызовов $http все они одновременно загружаются одновременно и uplaod.

Петля не ждет завершения итерации и переходит непосредственно к следующей итерации. Я хочу, чтобы это было синхронно, видео нужно загружать и загружать по одному. Я бы предпочел не использовать интерфейс Promises, я спешу, и я не знаю много о них. Если вы это сделаете, объясните это как можно больше.

+1

Вы * не хотите * делать запросы * синхронно *. Вы * делаете * хотите сделать их * последовательными *. –

+0

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

+0

@ T.J.Crowder Как сделать их последовательными, и какая разница, не могли бы вы объяснить, пожалуйста? – DeltaWeb

ответ

3

Вы не хотите сделать запросы синхронно. Вы do хотите сделать их последовательный. (Синхронный запрос на Ajax является тот, который держит в JavaScript UI нить   — и обычно UI браузера, по крайней мере, в этой вкладке   — ждет операции Ajax для завершения. Это делает для бедных пользователей. Делая их последовательно просто означает делать один за другим, например, последовательно, а не параллельно.)

Обычный способ сделать это, чтобы отслеживать, на каком из них вы работаете, выполняете ли вы обработку и затем обрабатываете что один, переходите к следующему; см комментариев:

$scope.upload = function() { 
    // Grab the array and start with index = 0 
    var videos = $scope.videoList; 
    var index = 0; 
    if (videos.length) { 
     // Start the process 
     next(); 
    } 

    // Our handler for each video 
    function next() { 
     // Get the video 
     var video = videos[index]; 
     video.state = "Downloading" 
     $scope.msg = "The video is downloading" 
     $http.post("/download", { 
      link: video.link, 
      title: video.title 
     }).then(function(resp) { 
      $scope.msg = "The video has been downloaded on the server, it will now start uploading" 
      var filen = resp.data["fn"] 
      var title = resp.data["title"] 
      video.state = "Uploading" 
      $http.get("/uploadVid?file=" + filen + "&title=" + title).then(function(resp) { 
       if (resp.data == "0002") { 
        alert("You didn't authorize the App yet, please authorize it to be able to use it .") 
       } 
       if (resp.data == "000X") { 
        alert("An error occured, please retry .") 
       } else { 
        $scope.msg = "the video uploaded, here's the link: " + resp.data 
        video.state = "Done" 
        video.link = resp.data 

        // Do the next video now we've finished this one 
        if (++index < videos.length) { 
         next(); 
        } 
       } 
      }) 
     }) 
    } 
} 

Примечания: накатали, возможно, не все я пересек и T, пунктир, но предположительно основы понятны.

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