2016-12-10 7 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

ここを参照してくださいArray.reduceを使用することができ、一連のあなたの約束を実行する場合 - http://stackoverflow.com/documentation/javascript/231/promises/5917/reduce-配列間の約束#t = 201612101336270481763 –

答えて

2

あなたは()

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

Q()とは何ですか? – Forivin

+0

'Q()'は、プロビジョニングチェーンをキックスタートするために空の約束(Q libを使用する - これは他の約束でもよい)であるため、 'promise'を減らすために渡される関数は' Q – hackerrdave

+0

私は約束のlibを使用していません。私はネイティブJS約束(ECMA6)を使用しています。私はプロミス()を使うか、代わりに何かを使うことができますか? – Forivin