How does an array of promises work exactly with reduce?
I was reading this article HERE, which speaks about how can you use reduce with promises and in the end the following snippet is shown:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
So without changing much of the code , i made the following demo:
const tasks = [ fetch('https://jsonplaceholder.typicode.com/todos/1') ,
fetch('https://jsonplaceholder.typicode.com/todos/2') ,
fetch('https://jsonplaceholder.typicode.com/todos/3') ];
tasks.reduce((promiseChain, currentTask) => {
console.log(promiseChain);
return promiseChain.then(chainResults => {
return currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
});
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
console.log(arrayOfResults);
});
But i still don't understand , since reduce is simplistically just a forEach loop and inside reduce we are relying on a promise being returned, what is the guareenty that the reduce function will not just loop though all the elements in the array (in this case an array of promises) , without the then() firing ?
javascript es6-promise
|
show 1 more comment
I was reading this article HERE, which speaks about how can you use reduce with promises and in the end the following snippet is shown:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
So without changing much of the code , i made the following demo:
const tasks = [ fetch('https://jsonplaceholder.typicode.com/todos/1') ,
fetch('https://jsonplaceholder.typicode.com/todos/2') ,
fetch('https://jsonplaceholder.typicode.com/todos/3') ];
tasks.reduce((promiseChain, currentTask) => {
console.log(promiseChain);
return promiseChain.then(chainResults => {
return currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
});
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
console.log(arrayOfResults);
});
But i still don't understand , since reduce is simplistically just a forEach loop and inside reduce we are relying on a promise being returned, what is the guareenty that the reduce function will not just loop though all the elements in the array (in this case an array of promises) , without the then() firing ?
javascript es6-promise
1
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example casePromise.all(tasks).then()
would likely be the better solution.
– D Lowther
Nov 13 '18 at 12:07
1
An array of promises doesn't work withreduce
at all, you'd just usePromise.all
. You are talking about an array of tasks (functions that return promises) however.
– Bergi
Nov 13 '18 at 12:43
2
…and indeed, the code you posted here does not work sequentially, it does the threefetch
requests immediately.
– Bergi
Nov 13 '18 at 12:47
"reduce is simplistically just a forEach loop" - better to look at it the other way round:forEach
is just areduce
loop but ignoring return values.
– Bergi
Nov 13 '18 at 20:20
1
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22
|
show 1 more comment
I was reading this article HERE, which speaks about how can you use reduce with promises and in the end the following snippet is shown:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
So without changing much of the code , i made the following demo:
const tasks = [ fetch('https://jsonplaceholder.typicode.com/todos/1') ,
fetch('https://jsonplaceholder.typicode.com/todos/2') ,
fetch('https://jsonplaceholder.typicode.com/todos/3') ];
tasks.reduce((promiseChain, currentTask) => {
console.log(promiseChain);
return promiseChain.then(chainResults => {
return currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
});
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
console.log(arrayOfResults);
});
But i still don't understand , since reduce is simplistically just a forEach loop and inside reduce we are relying on a promise being returned, what is the guareenty that the reduce function will not just loop though all the elements in the array (in this case an array of promises) , without the then() firing ?
javascript es6-promise
I was reading this article HERE, which speaks about how can you use reduce with promises and in the end the following snippet is shown:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
So without changing much of the code , i made the following demo:
const tasks = [ fetch('https://jsonplaceholder.typicode.com/todos/1') ,
fetch('https://jsonplaceholder.typicode.com/todos/2') ,
fetch('https://jsonplaceholder.typicode.com/todos/3') ];
tasks.reduce((promiseChain, currentTask) => {
console.log(promiseChain);
return promiseChain.then(chainResults => {
return currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
});
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
console.log(arrayOfResults);
});
But i still don't understand , since reduce is simplistically just a forEach loop and inside reduce we are relying on a promise being returned, what is the guareenty that the reduce function will not just loop though all the elements in the array (in this case an array of promises) , without the then() firing ?
javascript es6-promise
javascript es6-promise
edited Nov 13 '18 at 12:08
Alexander Solonik
asked Nov 13 '18 at 11:16
Alexander SolonikAlexander Solonik
3,41063386
3,41063386
1
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example casePromise.all(tasks).then()
would likely be the better solution.
– D Lowther
Nov 13 '18 at 12:07
1
An array of promises doesn't work withreduce
at all, you'd just usePromise.all
. You are talking about an array of tasks (functions that return promises) however.
– Bergi
Nov 13 '18 at 12:43
2
…and indeed, the code you posted here does not work sequentially, it does the threefetch
requests immediately.
– Bergi
Nov 13 '18 at 12:47
"reduce is simplistically just a forEach loop" - better to look at it the other way round:forEach
is just areduce
loop but ignoring return values.
– Bergi
Nov 13 '18 at 20:20
1
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22
|
show 1 more comment
1
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example casePromise.all(tasks).then()
would likely be the better solution.
– D Lowther
Nov 13 '18 at 12:07
1
An array of promises doesn't work withreduce
at all, you'd just usePromise.all
. You are talking about an array of tasks (functions that return promises) however.
– Bergi
Nov 13 '18 at 12:43
2
…and indeed, the code you posted here does not work sequentially, it does the threefetch
requests immediately.
– Bergi
Nov 13 '18 at 12:47
"reduce is simplistically just a forEach loop" - better to look at it the other way round:forEach
is just areduce
loop but ignoring return values.
– Bergi
Nov 13 '18 at 20:20
1
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22
1
1
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of
.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example case Promise.all(tasks).then()
would likely be the better solution.– D Lowther
Nov 13 '18 at 12:07
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of
.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example case Promise.all(tasks).then()
would likely be the better solution.– D Lowther
Nov 13 '18 at 12:07
1
1
An array of promises doesn't work with
reduce
at all, you'd just use Promise.all
. You are talking about an array of tasks (functions that return promises) however.– Bergi
Nov 13 '18 at 12:43
An array of promises doesn't work with
reduce
at all, you'd just use Promise.all
. You are talking about an array of tasks (functions that return promises) however.– Bergi
Nov 13 '18 at 12:43
2
2
…and indeed, the code you posted here does not work sequentially, it does the three
fetch
requests immediately.– Bergi
Nov 13 '18 at 12:47
…and indeed, the code you posted here does not work sequentially, it does the three
fetch
requests immediately.– Bergi
Nov 13 '18 at 12:47
"reduce is simplistically just a forEach loop" - better to look at it the other way round:
forEach
is just a reduce
loop but ignoring return values.– Bergi
Nov 13 '18 at 20:20
"reduce is simplistically just a forEach loop" - better to look at it the other way round:
forEach
is just a reduce
loop but ignoring return values.– Bergi
Nov 13 '18 at 20:20
1
1
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22
|
show 1 more comment
1 Answer
1
active
oldest
votes
Ok, back from reading the article with a more complete answer. This tactic is for async tasks that rely on one another, but aren't always the same. If they were a fixed structure you would do (from the example):
return task1.then(result1 =>
task2.then(result2 =>
task3.then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
Think of this in terms of doing maybe database work.
return dbOrm.task1.create()
.then(newRecord =>
// task 2 requires the id from the new record to operate
dbOrm.task2.create({task1_id: newRecord.id})
.then(result2 =>
// some other async that relies on result2
task3(result2).then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
This is a fixed set of dependencies, they rely on each other to operate and you need the results of all of them to continue.
The example you linked is meant for that kind of serial execution but in a situation with non-fixed dependencies. Reduce is being used to synchronously constructing a chain of async actions that can then resolve on their own, and since the reduce function is returning a resolved promise you can chain another function off the end of it to handle the completed chain.
Reduce is more than a forEach loop even though they both use iteration to move over an array. Reduce also passes the returned result of the previous iteration to the next iteration. You are 'Reducing' your group of tasks down to one completed task; forEach doesn't act to change the array it is operating on (and Map, another iterating array function, returns a modified new array from the old).
so using the example code:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
You would get something like this given 2 iterataions:
// 1
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
// 2
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
// the then after the reduce
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
.then(arrayOfResults => //do Something)
.catch(//because you should handle errors)
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53279833%2fhow-does-an-array-of-promises-work-exactly-with-reduce%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Ok, back from reading the article with a more complete answer. This tactic is for async tasks that rely on one another, but aren't always the same. If they were a fixed structure you would do (from the example):
return task1.then(result1 =>
task2.then(result2 =>
task3.then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
Think of this in terms of doing maybe database work.
return dbOrm.task1.create()
.then(newRecord =>
// task 2 requires the id from the new record to operate
dbOrm.task2.create({task1_id: newRecord.id})
.then(result2 =>
// some other async that relies on result2
task3(result2).then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
This is a fixed set of dependencies, they rely on each other to operate and you need the results of all of them to continue.
The example you linked is meant for that kind of serial execution but in a situation with non-fixed dependencies. Reduce is being used to synchronously constructing a chain of async actions that can then resolve on their own, and since the reduce function is returning a resolved promise you can chain another function off the end of it to handle the completed chain.
Reduce is more than a forEach loop even though they both use iteration to move over an array. Reduce also passes the returned result of the previous iteration to the next iteration. You are 'Reducing' your group of tasks down to one completed task; forEach doesn't act to change the array it is operating on (and Map, another iterating array function, returns a modified new array from the old).
so using the example code:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
You would get something like this given 2 iterataions:
// 1
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
// 2
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
// the then after the reduce
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
.then(arrayOfResults => //do Something)
.catch(//because you should handle errors)
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
add a comment |
Ok, back from reading the article with a more complete answer. This tactic is for async tasks that rely on one another, but aren't always the same. If they were a fixed structure you would do (from the example):
return task1.then(result1 =>
task2.then(result2 =>
task3.then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
Think of this in terms of doing maybe database work.
return dbOrm.task1.create()
.then(newRecord =>
// task 2 requires the id from the new record to operate
dbOrm.task2.create({task1_id: newRecord.id})
.then(result2 =>
// some other async that relies on result2
task3(result2).then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
This is a fixed set of dependencies, they rely on each other to operate and you need the results of all of them to continue.
The example you linked is meant for that kind of serial execution but in a situation with non-fixed dependencies. Reduce is being used to synchronously constructing a chain of async actions that can then resolve on their own, and since the reduce function is returning a resolved promise you can chain another function off the end of it to handle the completed chain.
Reduce is more than a forEach loop even though they both use iteration to move over an array. Reduce also passes the returned result of the previous iteration to the next iteration. You are 'Reducing' your group of tasks down to one completed task; forEach doesn't act to change the array it is operating on (and Map, another iterating array function, returns a modified new array from the old).
so using the example code:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
You would get something like this given 2 iterataions:
// 1
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
// 2
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
// the then after the reduce
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
.then(arrayOfResults => //do Something)
.catch(//because you should handle errors)
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
add a comment |
Ok, back from reading the article with a more complete answer. This tactic is for async tasks that rely on one another, but aren't always the same. If they were a fixed structure you would do (from the example):
return task1.then(result1 =>
task2.then(result2 =>
task3.then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
Think of this in terms of doing maybe database work.
return dbOrm.task1.create()
.then(newRecord =>
// task 2 requires the id from the new record to operate
dbOrm.task2.create({task1_id: newRecord.id})
.then(result2 =>
// some other async that relies on result2
task3(result2).then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
This is a fixed set of dependencies, they rely on each other to operate and you need the results of all of them to continue.
The example you linked is meant for that kind of serial execution but in a situation with non-fixed dependencies. Reduce is being used to synchronously constructing a chain of async actions that can then resolve on their own, and since the reduce function is returning a resolved promise you can chain another function off the end of it to handle the completed chain.
Reduce is more than a forEach loop even though they both use iteration to move over an array. Reduce also passes the returned result of the previous iteration to the next iteration. You are 'Reducing' your group of tasks down to one completed task; forEach doesn't act to change the array it is operating on (and Map, another iterating array function, returns a modified new array from the old).
so using the example code:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
You would get something like this given 2 iterataions:
// 1
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
// 2
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
// the then after the reduce
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
.then(arrayOfResults => //do Something)
.catch(//because you should handle errors)
Ok, back from reading the article with a more complete answer. This tactic is for async tasks that rely on one another, but aren't always the same. If they were a fixed structure you would do (from the example):
return task1.then(result1 =>
task2.then(result2 =>
task3.then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
Think of this in terms of doing maybe database work.
return dbOrm.task1.create()
.then(newRecord =>
// task 2 requires the id from the new record to operate
dbOrm.task2.create({task1_id: newRecord.id})
.then(result2 =>
// some other async that relies on result2
task3(result2).then(result3 =>
[ result1, result2, result3 ]
)
)
).then(arrayOfResults => {
// Do something with all results
});
This is a fixed set of dependencies, they rely on each other to operate and you need the results of all of them to continue.
The example you linked is meant for that kind of serial execution but in a situation with non-fixed dependencies. Reduce is being used to synchronously constructing a chain of async actions that can then resolve on their own, and since the reduce function is returning a resolved promise you can chain another function off the end of it to handle the completed chain.
Reduce is more than a forEach loop even though they both use iteration to move over an array. Reduce also passes the returned result of the previous iteration to the next iteration. You are 'Reducing' your group of tasks down to one completed task; forEach doesn't act to change the array it is operating on (and Map, another iterating array function, returns a modified new array from the old).
so using the example code:
const tasks = getTaskArray();
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask.then(currentResult =>
[ ...chainResults, currentResult ]
)
);
}, Promise.resolve()).then(arrayOfResults => {
// Do something with all results
});
You would get something like this given 2 iterataions:
// 1
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
// 2
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
// the then after the reduce
Promise.resolve()
.then(chainResults => task1().then(task1Result => ([ ...chainResults, task1Result])
.then(chainResults => task2().then(task2Result => ([ ...chainResults, task2Result])
.then(arrayOfResults => //do Something)
.catch(//because you should handle errors)
answered Nov 13 '18 at 12:39
D LowtherD Lowther
1,3181414
1,3181414
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
add a comment |
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
1
1
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
please give me time to go though your answer and accept . thanks for the help +1 .
– Alexander Solonik
Nov 14 '18 at 19:15
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
Brilliant explanation ! Thanks a ton , absolutely brilliant ! Mind blowing ... FANTASTIC !
– Alexander Solonik
Nov 18 '18 at 22:41
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53279833%2fhow-does-an-array-of-promises-work-exactly-with-reduce%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Its promises all the way down, it is just looping through the reduce elements and the code is structured in such a way that you are creating a large chain of
.then
operations. I can see reasons to do something like this (you need intermediate values to make the next call), but in your example casePromise.all(tasks).then()
would likely be the better solution.– D Lowther
Nov 13 '18 at 12:07
1
An array of promises doesn't work with
reduce
at all, you'd just usePromise.all
. You are talking about an array of tasks (functions that return promises) however.– Bergi
Nov 13 '18 at 12:43
2
…and indeed, the code you posted here does not work sequentially, it does the three
fetch
requests immediately.– Bergi
Nov 13 '18 at 12:47
"reduce is simplistically just a forEach loop" - better to look at it the other way round:
forEach
is just areduce
loop but ignoring return values.– Bergi
Nov 13 '18 at 20:20
1
You might want to have a look at stackoverflow.com/a/30823708/1048572
– Bergi
Nov 13 '18 at 20:22