2014-10-12 2 views
0

Я нашел все полезные сообщения/информацию о $ q, $ q.all и цепочке в целом, но я не нашел примеров моей точной проблемы, поэтому я Интересно, возможно ли то, что я хочу сделать. У меня есть ряд вызовов, которые мне нужно сделать, и каждый из них зависит от предыдущего, но есть шаг в середине, где серия распадается на несколько параллелей. Суть этого выходит что-то вроде этого:.цепочки нескольких вызовов http против цикла

call #1: get keyword (based on inputs) 
call #2: with keyword, get list of items 
call #3: with item ID#s, get item profiles 
call #4: with data in profiles, get item images 

(я знаю, я знаю, четыре звонка только за один смешно, не говоря уже об общем количестве вызовов шестнадцать, но это для прототипа не должен я просто должен доказать, что могу перейти к этому заключительному этапу с существующими данными/вызовами.)

Во всяком случае, это означает, что # 1 - это один вызов для всех ... и затем от # 2 , он разбивается, и я должен делать # 2, # 3 и # 4 для каждого другого ID #, который я получил от # 1. Я фыркнул с помощью jsonplaceholder. Он должен получить первый набор, затем выполнить следующие два вызова с полученными идентификаторами, один цикл на ID.

Я пробовал простой цикл (который Plunker говорит мне, что я не могу делать с ним функцию). Я попробовал angular.forEach (внутри $ scope.watch и за его пределами), но это не похоже, чтобы мне что-нибудь на все:

angular.forEach($scope.resultsb, function(value, key) { 
    console.log(key + ': ' + value); 
    $http.get('http://jsonplaceholder.typicode.com/users?id='+ value) 
    .then(function(res2){ 
    $scope.data2 = res2.data; 
     var obj = { 
     title: $scope.results1[i].title, 
     id: $scope.data2[i].id, 
     username: $scope.data2.username 
     }; 
    $scope.results2.push(obj); 

Я думаю, что Foreach просто не пинать в правильно b/c он не может работать до тех пор, пока я не получу $ scope.results1 (результаты первого шага), но могу ли я связать вызов $ http с циклом?

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

ответ

0

Я ПОЛУЧИЛ РАБОТУ.

Это может быть наихудший случай использования функций, но он работает, и я получаю результаты. Не совсем - я думаю, что некоторые из вызовов тайм-аут, поэтому я решил, что мне нужно попросить, например, 6, а затем я получаю по крайней мере 4 результата, которые я хочу. Это, вероятно, свидетельствует о том, что это отчаянно требует единственной конечной точки вместо того, чтобы делать логику на интерфейсе, но она работает достаточно для прототипа, поэтому я счастлив (на данный момент).

В моем контроллере я получаю первый набор идентификаторов и используя простой цикл for, я назначаю каждому элементу loop-id. Затем я вызываю getUser(), с номером (для подключения информации к первому набору результатов) и id (для подключения к фактическому пользователю, которого я отслеживаю). Вот функция ж/ее внутренних цепей:

function getUser(num, id) { 

$http.get('http://jsonplaceholder.typicode.com/users?id='+ id) 
.then(function(res2){ 
    $scope.data2 = res2.data; 
    if ($scope.data2[0].username !== 'undefined') { 
    var obj = { 
     num: $scope.results1[num].num, 
     id: $scope.results1[num].id, 
     title: $scope.results1[num].title,   
     username: $scope.data2[0].username 
    }; 
    $scope.results2.push(obj); 
    } 

    return $http.get('http://jsonplaceholder.typicode.com/comments?id=' + id); 
    }).then(function(res3){ 
    if ($scope.results2[num].username !== 'undefined') { 
     $scope.data3 = res3.data; 
     var obj = { 
     num: num, 
     id: $scope.results2[num].id, 
     title: $scope.results2[num].title, 
     username: $scope.results2[num].username, 
     email: $scope.data3[0].email 
     }; 
     $scope.results3.push(obj); 
    } 
    }); 
} 

Вы можете увидеть всю вещь в - это показывает результат каждого шага (results1, results2, results3). Надеюсь, мне больше не придется делать что-то такое безумное, но на всякий случай, возможно, это поможет кому-то. Или, может быть, это заставит кого-то подпрыгнуть и рассказать мне все, что я сделал не так, но все будет хорошо. Надо как-то учиться.:)

0

Ваш друг будет работать даже без ответа, как это асинхронный, вместо того, чтобы сделать функцию и вызвать его, когда вы получите обратный вызов в .then()

отредактировали plunker: http://plnkr.co/edit/mxvvCB?p=preview

как это:

$scope.Call = function(value) { 
    if(typeof value[$scope.counter] !== 'undefined'){ 
    value = value[$scope.counter].id; 
    var i =$scope.counter; 
    console.log(value+' ' +i); 
    $http.get('http://jsonplaceholder.typicode.com/users?id='+ value) 
    .then(function(res2){console.log(res2); 
     $scope.data2 = res2.data; 
     var obj = { 
      title: $scope.results1[i].title, 
      id: $scope.data2[0].id, 
      username: $scope.data2.username 
     }; 
    $scope.results2.push(obj); 

    $scope.counter++; 
    $scope.Call($scope.resultsb); 
    }); 
    } 
    }; 

Надеюсь, это то, чего вы пытаетесь достичь.

+0

Нет, это просто дает мне результаты первого идентификатора. Я не уверен, где $ scope.Call loop - это цикл вообще, или он просто находит идентификатор в первом наборе результатов и нажимает только это? – kl02

+0

это цикл, потому что как только он получает обратный вызов из запроса $ http, он снова вызывает себя, вы должны проверить консоль на наличие сообщений, может быть, вы узнаете, где проблема –

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