Turning nested jQuery Promises into flat code structure using .done() and .then()
up vote
1
down vote
favorite
This code uses jQuery promises in combination with callbacks does the following:
- Saves Group UUID to server using
storeGroupOnServer()
- Creates a DOM element for the group using
createGroupDomNode()
- Creates child elements for each image, using
createNewChildDomNode()
How can this be written more flat (avoiding the nesting), using .then()?
var groupPromise = groupInstance.promise();
var arrayOfFiles = groupInstance.files();
groupPromise.done(function(fileGroupInfo) {
storeGroupOnServer(fileGroupInfo.uuid, function(groupid){
createGroupDomNode(groupid, function(groupnode){
$.each(arrayOfFiles, function(i, file) {
file.done(function(fileInfo) {
createNewChildDomNode(fileInfo.cdnUrl, groupnode);
});
});
});
});
});
Step 1: storeGroupOnServer():
storeGroupOnServer = function(uuid, callback) {
$.post('saveGroup.php', {uuid:uuid},
function(data) {
callback(data.groupid);
},'json');
};
Step 2: createGroupDomNode():
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
callback(newnode);
}
Step 3: createNewChildDomNode():
function createNewChildDomNode(imgpath, groupdom){
imgnode = $('<img/>').attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}
javascript jquery promise
add a comment |
up vote
1
down vote
favorite
This code uses jQuery promises in combination with callbacks does the following:
- Saves Group UUID to server using
storeGroupOnServer()
- Creates a DOM element for the group using
createGroupDomNode()
- Creates child elements for each image, using
createNewChildDomNode()
How can this be written more flat (avoiding the nesting), using .then()?
var groupPromise = groupInstance.promise();
var arrayOfFiles = groupInstance.files();
groupPromise.done(function(fileGroupInfo) {
storeGroupOnServer(fileGroupInfo.uuid, function(groupid){
createGroupDomNode(groupid, function(groupnode){
$.each(arrayOfFiles, function(i, file) {
file.done(function(fileInfo) {
createNewChildDomNode(fileInfo.cdnUrl, groupnode);
});
});
});
});
});
Step 1: storeGroupOnServer():
storeGroupOnServer = function(uuid, callback) {
$.post('saveGroup.php', {uuid:uuid},
function(data) {
callback(data.groupid);
},'json');
};
Step 2: createGroupDomNode():
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
callback(newnode);
}
Step 3: createNewChildDomNode():
function createNewChildDomNode(imgpath, groupdom){
imgnode = $('<img/>').attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}
javascript jquery promise
Where isarrayOfFilesdefined?
– guest271314
yesterday
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
If aPromiseisreturned from the function calls one pattern that could potentially be used isgroupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead ofcalback(<function_call>)
– guest271314
9 hours ago
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
This code uses jQuery promises in combination with callbacks does the following:
- Saves Group UUID to server using
storeGroupOnServer()
- Creates a DOM element for the group using
createGroupDomNode()
- Creates child elements for each image, using
createNewChildDomNode()
How can this be written more flat (avoiding the nesting), using .then()?
var groupPromise = groupInstance.promise();
var arrayOfFiles = groupInstance.files();
groupPromise.done(function(fileGroupInfo) {
storeGroupOnServer(fileGroupInfo.uuid, function(groupid){
createGroupDomNode(groupid, function(groupnode){
$.each(arrayOfFiles, function(i, file) {
file.done(function(fileInfo) {
createNewChildDomNode(fileInfo.cdnUrl, groupnode);
});
});
});
});
});
Step 1: storeGroupOnServer():
storeGroupOnServer = function(uuid, callback) {
$.post('saveGroup.php', {uuid:uuid},
function(data) {
callback(data.groupid);
},'json');
};
Step 2: createGroupDomNode():
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
callback(newnode);
}
Step 3: createNewChildDomNode():
function createNewChildDomNode(imgpath, groupdom){
imgnode = $('<img/>').attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}
javascript jquery promise
This code uses jQuery promises in combination with callbacks does the following:
- Saves Group UUID to server using
storeGroupOnServer()
- Creates a DOM element for the group using
createGroupDomNode()
- Creates child elements for each image, using
createNewChildDomNode()
How can this be written more flat (avoiding the nesting), using .then()?
var groupPromise = groupInstance.promise();
var arrayOfFiles = groupInstance.files();
groupPromise.done(function(fileGroupInfo) {
storeGroupOnServer(fileGroupInfo.uuid, function(groupid){
createGroupDomNode(groupid, function(groupnode){
$.each(arrayOfFiles, function(i, file) {
file.done(function(fileInfo) {
createNewChildDomNode(fileInfo.cdnUrl, groupnode);
});
});
});
});
});
Step 1: storeGroupOnServer():
storeGroupOnServer = function(uuid, callback) {
$.post('saveGroup.php', {uuid:uuid},
function(data) {
callback(data.groupid);
},'json');
};
Step 2: createGroupDomNode():
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
callback(newnode);
}
Step 3: createNewChildDomNode():
function createNewChildDomNode(imgpath, groupdom){
imgnode = $('<img/>').attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}
javascript jquery promise
javascript jquery promise
edited 11 hours ago
asked 2 days ago
bart
1318
1318
Where isarrayOfFilesdefined?
– guest271314
yesterday
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
If aPromiseisreturned from the function calls one pattern that could potentially be used isgroupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead ofcalback(<function_call>)
– guest271314
9 hours ago
add a comment |
Where isarrayOfFilesdefined?
– guest271314
yesterday
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
If aPromiseisreturned from the function calls one pattern that could potentially be used isgroupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead ofcalback(<function_call>)
– guest271314
9 hours ago
Where is
arrayOfFiles defined?– guest271314
yesterday
Where is
arrayOfFiles defined?– guest271314
yesterday
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
If a
Promise is returned from the function calls one pattern that could potentially be used is groupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead of calback(<function_call>)– guest271314
9 hours ago
If a
Promise is returned from the function calls one pattern that could potentially be used is groupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead of calback(<function_call>)– guest271314
9 hours ago
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
You can substitute returning Promise objects from functions for using callbacks as parameters to function, to chain .then() and .catch(). Array.prototype.map() and Promise.all() can be substituted for jQuery.each() which does not await the fulfillment of Promise objects iterated.
Which requires returning the jQuery promise object from storeGroupOnServer
storeGroupOnServer = function(uuid, callback) {
return $.post('saveGroup.php', {uuid:uuid},'json')
.then(function(data) {
return data.groupid;
});
};
and returning a jQuery promise object of Promise from createGroupDomNode
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
return $.Deferred().resolve(newnode);
}
and awaiting <img> element load event
function createNewChildDomNode(imgpath, groupdom){
return $.Deferred(function(dfd) {
imgnode = $('<img/>')
.on("load", dfd.resolve)
.on("error", dfd.reject)
.attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}).promise();
}
For example
const data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainadd a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You can substitute returning Promise objects from functions for using callbacks as parameters to function, to chain .then() and .catch(). Array.prototype.map() and Promise.all() can be substituted for jQuery.each() which does not await the fulfillment of Promise objects iterated.
Which requires returning the jQuery promise object from storeGroupOnServer
storeGroupOnServer = function(uuid, callback) {
return $.post('saveGroup.php', {uuid:uuid},'json')
.then(function(data) {
return data.groupid;
});
};
and returning a jQuery promise object of Promise from createGroupDomNode
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
return $.Deferred().resolve(newnode);
}
and awaiting <img> element load event
function createNewChildDomNode(imgpath, groupdom){
return $.Deferred(function(dfd) {
imgnode = $('<img/>')
.on("load", dfd.resolve)
.on("error", dfd.reject)
.attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}).promise();
}
For example
const data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainadd a comment |
up vote
0
down vote
You can substitute returning Promise objects from functions for using callbacks as parameters to function, to chain .then() and .catch(). Array.prototype.map() and Promise.all() can be substituted for jQuery.each() which does not await the fulfillment of Promise objects iterated.
Which requires returning the jQuery promise object from storeGroupOnServer
storeGroupOnServer = function(uuid, callback) {
return $.post('saveGroup.php', {uuid:uuid},'json')
.then(function(data) {
return data.groupid;
});
};
and returning a jQuery promise object of Promise from createGroupDomNode
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
return $.Deferred().resolve(newnode);
}
and awaiting <img> element load event
function createNewChildDomNode(imgpath, groupdom){
return $.Deferred(function(dfd) {
imgnode = $('<img/>')
.on("load", dfd.resolve)
.on("error", dfd.reject)
.attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}).promise();
}
For example
const data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainadd a comment |
up vote
0
down vote
up vote
0
down vote
You can substitute returning Promise objects from functions for using callbacks as parameters to function, to chain .then() and .catch(). Array.prototype.map() and Promise.all() can be substituted for jQuery.each() which does not await the fulfillment of Promise objects iterated.
Which requires returning the jQuery promise object from storeGroupOnServer
storeGroupOnServer = function(uuid, callback) {
return $.post('saveGroup.php', {uuid:uuid},'json')
.then(function(data) {
return data.groupid;
});
};
and returning a jQuery promise object of Promise from createGroupDomNode
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
return $.Deferred().resolve(newnode);
}
and awaiting <img> element load event
function createNewChildDomNode(imgpath, groupdom){
return $.Deferred(function(dfd) {
imgnode = $('<img/>')
.on("load", dfd.resolve)
.on("error", dfd.reject)
.attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}).promise();
}
For example
const data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainYou can substitute returning Promise objects from functions for using callbacks as parameters to function, to chain .then() and .catch(). Array.prototype.map() and Promise.all() can be substituted for jQuery.each() which does not await the fulfillment of Promise objects iterated.
Which requires returning the jQuery promise object from storeGroupOnServer
storeGroupOnServer = function(uuid, callback) {
return $.post('saveGroup.php', {uuid:uuid},'json')
.then(function(data) {
return data.groupid;
});
};
and returning a jQuery promise object of Promise from createGroupDomNode
createGroupDomNode = function(groupid, callback) {
var cloner = $('#cloner');
var newnode = cloner.clone(true);
newnode.attr('id',groupid);
newnode.removeClass('hide');
cloner.after(newnode);
return $.Deferred().resolve(newnode);
}
and awaiting <img> element load event
function createNewChildDomNode(imgpath, groupdom){
return $.Deferred(function(dfd) {
imgnode = $('<img/>')
.on("load", dfd.resolve)
.on("error", dfd.reject)
.attr('src',imgpath);
picnode = $('<picture/>').append(imgnode);
$(groupdom).first().prepend(picnode);
}).promise();
}
For example
const data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainconst data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainconst data = {
uuid: {
1: 4,
2: 5,
3: 6
}
};
const response = {
4: "a",
5: "b",
6: "c"
};
const groupPromise = Promise.resolve(data.uuid[1]); // initial `Promise`
const arrayOfFiles = [Promise.resolve({
fileInfo: {
cdnUrl: 10
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 20
}
}), Promise.resolve({
fileInfo: {
cdnUrl: 30
}
})];
const storeGroupOnServer = (uuid) => {
console.log({
uuid
});
// `return` response `Promise`
return Promise.resolve(response[uuid])
};
const createGroupDomNode = (groupid) => {
console.log({
groupid
});
// `return` `groupid`
return Promise.resolve(groupid)
};
const createNewChildDomNode = (groupdom, {
// destructure `cdnUrl` define as `imgpath`
fileInfo: {
cdnUrl: imgpath
}
}) => {
console.log({
imgpath,
groupdom
});
// process `<img>` elements here
// `return` resolved or rejected `Promise`
// at `load` or `error` event
return Promise.resolve("done processing " + imgpath)
};
let handleFiles = (groupnode, file) => {
console.log({
groupnode,
file
});
// handle each `file` `Promise`, pass `group` node to
// function passed to `.then()`
return file.then(createNewChildDomNode.bind(null, groupnode))
};
const handleGroupDomNodes = (groupnode) => {
console.log({
groupnode
});
// use `Promise.all()`, `.map()` to process array of `Promise` objects
return Promise.all(
arrayOfFiles.map(handleFiles.bind(null, groupnode))
)
};
groupPromise
.then(storeGroupOnServer)
.then(createGroupDomNode)
.then(handleGroupDomNodes)
.then(complete => console.log(complete)) // to illustrate chain completes
.catch(err => console.error(err)); // handle errors in chainanswered 4 hours ago
guest271314
1215
1215
add a comment |
add a comment |
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%2fcodereview.stackexchange.com%2fquestions%2f207833%2fturning-nested-jquery-promises-into-flat-code-structure-using-done-and-then%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
Where is
arrayOfFilesdefined?– guest271314
yesterday
@guest271314 Is defined outside the function, I've added it for completeness.
– bart
11 hours ago
If a
Promiseisreturned from the function calls one pattern that could potentially be used isgroupPromise.then(storeGroupServer).then(createGroupDomNode).then(groupNode=>Promise.all(arrayOfFiles.map(createNewChildDomNode))).catch(err=>console.error(err)), instead ofcalback(<function_call>)– guest271314
9 hours ago