2016-03-11 7 views
1

я следующий код:Асинхронный вызов внутри цикла

$scope.getEntriesBySpace = function(space, entryIds){ 
     var entriesHolder = [], 
      errors = []; 

     if(entryIds && entryIds.length > 0){ 
      angular.forEach(entryIds, function(entryId){ 
       space.cf_space.getEntry(entryId.trim()).catch(function(error) { 
        console.log('Could not find entry using access token, Error', error); 
        return error; 
       }).then(function(response) { 
        if(response){ 
         entriesHolder.push(data); 
        }else{ 
         errors.push({"id": entryId, "message": "Entry not found"}); 
        } 
       }); 
      }); 
     } 
    }; 

я называю это так:

$scope.getEntriesBySpace(sourceSpace, entries); 

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

Любая помощь приветствуется.

Способ getEntry возвращает обещание.

Для исх увидеть эту библиотеку: https://github.com/contentful/contentful-management.js

Благодарности

+1

Звучит как этот http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – elclanrs

+0

@Hacketo: Как бы я хранить каждый ответ в массиве и возврат в конце всех вызовов завершены? – maverickosama92

+0

@elclanrs: Я пробовал это решение. Но он не работал, мне нужно иметь все ответы сразу. Так что я могу продолжить обработку на них. Пожалуйста, помогите мне здесь, я буду очень благодарен. Спасибо – maverickosama92

ответ

1

Итак, есть два способа сделать это. Когда у вас есть обещания, вы также обычно используете метод Promise.all, который является частью реализации обещаний. В Angular вы будете делать $ q.all.

Итак, вы можете сделать что-то вроде:

$q.all(entryIds.map(function(entryId){ return space.cf_space.getEntry(entryId.trim()) })) .then(function(entries){ console.log(entries) })

Однако, кажется, что вы используете SDK содержательной, где также есть метод, который имеет getEntries query parameters которые позволяют получить более чем одна запись сразу по одному запросу. Это было бы очень желательно, потому что это было бы намного быстрее.

space.cf_space.getEntries({'sys.id[in]': entryIds.join(',')}) .then(function(entries){ console.log(entries) })

+0

Спасибо, человек, ты потрясающий. – maverickosama92

+0

@trodigues: любезно помогите здесь http://stackoverflow.com/questions/36035199/how-to-set-contentful-js-api-call-ratelimit – maverickosama92

1

Вы можете использовать LIB асинхр для этого: https://github.com/caolan/async

$scope.getEntriesBySpace = function(space, entryIds){ 
    var entriesHolder = [], 
     errors = []; 

    var fn = function(entryId, callback){ 
      space.cf_space.getEntry(entryId.trim()) 
       .catch(function(error) { 
        console.log('Could not find entry using access token, Error', error); 
        /// just get out of here 
        return callback({"message": "Entry not found"}); 
       }).then(function(response) { 
        if(response){ 
         // good response 
         return callback(null, data); 
        }else{ 
         // bad response 
         return callback({"id": entryId, "message": "Entry not found"}); 
        } 
       }); 
    }); 

    if(entryIds && entryIds.length > 0){ 
     async.map(entryIds, fn, function(err, results){ 
      if(err) { 
       // deal with the errors 
      } 
      // your array 
      console.log(results); 
     }); 
    } 

}); 
+1

Спасибо, человек, оцените его. :) – maverickosama92

1

getEntriesBySpace не может возвращать массив элементов, которые вы хотите (asyncronicity). Однако он может вернуть обещание, которое ссылается на массив желаемых элементов. Или, так как вы тоже хотите ошибок, объект, который содержит как хорошие результаты, так и ошибки.

$scope.getEntriesBySpace = function(space, entryIds){ 

    if(entryIds instanceof Array){ 
     return Promise.all(entryIds.map(function(entryId){ 
      return space.cf_space.getEntry(entryId.trim()).catch(function(error) { 
       console.log('Could not find entry using access token, Error', error); 
       throw error; 
      }); 
     })).then(function(responses) { 
      var resultAndErrors = {result: [], errors: []}; 
      responses.forEach(function(response) { 
       if (!response) { 
        resultAndErrors.errors.push(({"id": entryId, "message": "Entry not found"}); 
       } 
       else { 
        resultAndErrors.result.push(response); 
       } 
      }); 
      return resultAndErrors; 
     }); 
    } 
    else { 
     return Promise.resolve([]); 
    } 
}; 
+0

Спасибо, человек, оцените. :) – maverickosama92

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