2016-12-10 5 views
1

У меня довольно простая проблема, которую я, похоже, не могу решить. Я также не мог найти что-либо в google/stackoverflow (возможно, я просто использую неправильные ключевые слова?)Создание обещаний динамически

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

Если бы я сделал это так, я бы не ждать обещанного быть решен до следующего вызова функции:

let paramerterArr = ['a','b','c','d','e','f'] 
paramerterArr.forEach((currentParam) => { 
    let promise = mySpecialFunction(currentParam) 
}) 

Если бы я сделал это так, я должен был бы написать много избыточного кода и я не могу просто изменить массив:

let paramerterArr = ['a','b','c','d','e','f'] 
mySpecialFunction(paramerterArr[0]).then(()=> { 
    return mySpecialFunction(paramerterArr[1]) 
}).then(()=> { 
    return mySpecialFunction(paramerterArr[2]) 
}).then(()=> { 
    return mySpecialFunction(paramerterArr[3]) 
}).then(()=> { 
    return mySpecialFunction(paramerterArr[4]) 
}).then(()=> { 
    return mySpecialFunction(paramerterArr[5]) 
}) 

и даже если бы я сделал это так, я не мог просто изменить массив:

Если бы я сделал это так Я бы придется писать много лишнего кода, и я не могу просто изменить массив:

let paramerterArr = ['a','b','c','d','e','f'] 
let currentPos = 0 
mySpecialFunction(currentPos).then(()=> { 
    currentPos++ 
    return mySpecialFunction(currentPos) 
}).then(()=> { 
    currentPos++ 
    return mySpecialFunction(currentPos) 
}).then(()=> { 
    currentPos++ 
    return mySpecialFunction(currentPos) 
}).then(()=> { 
    currentPos++ 
    return mySpecialFunction(currentPos) 
}).then(()=> { 
    currentPos++ 
    return mySpecialFunction(currentPos) 
}) 

Я просто не могу думать о умный способ сделать это ...
Может быть кто-то из вас есть идея , это было бы прекрасно.

+0

Смотрите здесь - http://stackoverflow.com/documentation/javascript/231/promises/5917/reduce- a-array-to-chain-promises # t = 201612101336270481763 –

ответ

2

Если вы хотите запустить свои обещания в серии вы можете использовать Array.reduce()

parameterArr.reduce(function(promise, item) { 
    return promise.then(function(result) { 
    return mySpecialFunction(item); 
    }) 
}, Promise.resolve()) 
+0

Что такое 'Q()'? – Forivin

+0

'Q()' - просто пустое обещание (используя Q lib - может быть любое другое обещание), чтобы запустить цепочку обещаний, поэтому в первый раз, когда функция, переданная для сокращения прогонов 'prom', будет' Q() ' – hackerrdave

+0

Я не использую обещание lib. Я использую собственные обещания JS (ECMA6). Могу ли я просто использовать Promise() или что-то другое? – Forivin