动态创建承诺

时间:2016-12-10 14:25:51

标签: javascript dynamic promise es6-promise

我有一个相当简单的问题,我似乎无法解决。我也无法在google / stackoverflow上找到任何内容(也许我只是使用了错误的关键字?)

我有一个值数组,我想为该数组中的每个元素调用一个特定的函数。棘手的是该函数返回一个promise,只有在解析了promise之后才能再次调用它。

如果我这样做的话,我不会在下一次函数调用之前等待承诺得到解决:

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)
})

我无法想出一个聪明的方法来做到这一点...... 也许你们中的某个人有一个想法,那会很棒。

1 个答案:

答案 0 :(得分:2)

如果你想连续运行promises,你可以使用Array.reduce()

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