。もちろん
//type: [number]
var myArray = [1, 2, 3, 4, 5, 6] //doesn't really matter
//type: number -> Promise<number>
function myPromise(num){
return new Promise((resolve) => {
window.setTimeout(()=>{
resolve(console.log("done: " + num) )
},2000)
})
}
//Array.reduce has type: [a] ~> ((b, a) -> b), b) -> b
//So it can have type:
//[number] ~> ((Promise<number> -> number -> Promise<number>), Promise<number>) -> Promise<number>
//Therefore we need to give reduce a function that takes a Promise
//resolving to a number and a number which makes a new promise.
//This is the function we want:
function sequencePromises(promise, number) {
return new Promise((resolve) => {
resolve(promise.then(_ => myPromise(number)));
}
}
myArray.reduce(sequencePromises, Promise.resolve());
エラーことができます約束を持っている場合、またはあなたが以前の結果が必要な場合、あなたはsequencePromises
は、より一般的なようにしたいかもしれませんが、この単純なアプローチは機能しません。
function genericSequencePromises(promiseFunction) {
return (promise, parameter) => {
return new Promise((resolve, reject) =>
return promiseFunction(resolve,
reject,
promise,
parameter));
}
}
をその後、あなたはプロミスを返す限り、あなたが望むものを何でもすることができます。
あなたはこの小さなヘルパーの恩恵を受ける可能性がある最後に、:一緒にすべてをもたらす
function promiseSeries(array, reducer) {
return array.reduce(reducer, Promise.resolve());
}
:
let sequencePromises = genericSequencePromises((resolve, reject, promise, num) => {
resolve(promise.then(_ => console.log(`done: ${num}`)));
}
promiseSeries(myArray, sequencePromises);
この方法は、あなたの質問にケースを扱うことができるだけでなく、はるかに複雑なケース。
Promise.Allはそれが十分ではありません、あなたは独自のオン –
@JohnPetersたいものがあるからそれは順番に解決されません。 – 4castle