2016-06-10 5 views
-3

Я изо всех сил, чтобы получить следующее Promise логическое право:Javascript Обещания в Для Loops

я называю API REST, который возвращает массив объектов. Затем мне нужно пройти через этот массив и начать строить новый массив объектов с некоторыми данными. Все это прекрасно работает.

В пределах данных, которые я получаю из ответа API, есть 2 поля id (в каждом объекте), для которых мне необходимо выполнить последующие вызовы API. Когда я получаю данные от каждого из этих вызовов, я добавляю несколько новых данных в свой новый объект. Только тогда, если цикл For продолжится.

Я пробовал использовать Promises, но по какой-то причине цикл For продолжается, а Promise по-прежнему занят. Есть идеи?

+1

Попробуйте использовать '.map()', 'Promise.all()' вместо 'for' петли – guest271314

+0

любой из стандартных методов itteration' для/для в/array.forEach/array.map' будет продолжайте, потому что они не являются асинхронными методами. Посмотрите на 'Promise.all', чтобы передать ему массив обещаний, с которым он будет решать, когда все это сделает. Если ваш рабочий процесс не может работать, как смотреть в рекурсивное решение. – ste2425

+0

Что с downvotes? – labyrinth

ответ

-1

Я бы рекомендовал использовать bluebird.

var Promise = require('bluebird'); 

    // slow method that takes a second to return 
    var asyncCall = (value) => { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => resolve(value), 1000); 
    }); 
    } 

    // things to iterate over 
    var values = [1,2,3,4]; 

    // using Promise, iterate over the promises 
    Promise.each(values, (value) => asyncCall(value).then(() => console.log(value))); 

    // if you have some other promise library instead of bluebird, you 
    // can manually implement it something like this. 
    // please be careful with error handling 
    function sequentialEach(values, cb) { 
    if (values.length === 0) { return }; 
    try { 
     var result = cb(values[0]); 
     if (result && result.then) { 
     return result.then(() => sequentialEach(values.slice(1), cb)); 
     } else { 
     return sequentialEach(values.slice(1), cb); 
     } 
    } catch (e) { 
     // assuming your library has .reject, you could alternatively 
     // new Promise((resolve, reject) => reject(e)) 
     return Promise.reject(e); 
    } 
    } 
Смежные вопросы