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:




  1. Saves Group UUID to server using storeGroupOnServer()

  2. Creates a DOM element for the group using createGroupDomNode()

  3. 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);
}









share|improve this question
























  • Where is arrayOfFiles defined?
    – guest271314
    Nov 17 at 23:36










  • @guest271314 Is defined outside the function, I've added it for completeness.
    – bart
    2 days ago















up vote
1
down vote

favorite












This code uses jQuery promises in combination with callbacks does the following:




  1. Saves Group UUID to server using storeGroupOnServer()

  2. Creates a DOM element for the group using createGroupDomNode()

  3. 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);
}









share|improve this question
























  • Where is arrayOfFiles defined?
    – guest271314
    Nov 17 at 23:36










  • @guest271314 Is defined outside the function, I've added it for completeness.
    – bart
    2 days ago













up vote
1
down vote

favorite









up vote
1
down vote

favorite











This code uses jQuery promises in combination with callbacks does the following:




  1. Saves Group UUID to server using storeGroupOnServer()

  2. Creates a DOM element for the group using createGroupDomNode()

  3. 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);
}









share|improve this question















This code uses jQuery promises in combination with callbacks does the following:




  1. Saves Group UUID to server using storeGroupOnServer()

  2. Creates a DOM element for the group using createGroupDomNode()

  3. 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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago

























asked Nov 16 at 20:22









bart

1318




1318












  • Where is arrayOfFiles defined?
    – guest271314
    Nov 17 at 23:36










  • @guest271314 Is defined outside the function, I've added it for completeness.
    – bart
    2 days ago


















  • Where is arrayOfFiles defined?
    – guest271314
    Nov 17 at 23:36










  • @guest271314 Is defined outside the function, I've added it for completeness.
    – bart
    2 days ago
















Where is arrayOfFiles defined?
– guest271314
Nov 17 at 23:36




Where is arrayOfFiles defined?
– guest271314
Nov 17 at 23:36












@guest271314 Is defined outside the function, I've added it for completeness.
– bart
2 days ago




@guest271314 Is defined outside the function, I've added it for completeness.
– bart
2 days ago










1 Answer
1






active

oldest

votes

















up vote
1
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 chain








share|improve this answer





















    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
    });
    });
    }, "mathjax-editing");

    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: "196"
    };
    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',
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    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
    });


    }
    });














     

    draft saved


    draft discarded


















    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

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    1
    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 chain








    share|improve this answer

























      up vote
      1
      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 chain








      share|improve this answer























        up vote
        1
        down vote










        up vote
        1
        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 chain








        share|improve this answer












        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 chain








        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 chain





        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 chain






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 2 days ago









        guest271314

        1315




        1315






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Morgemoulin

            Scott Moir

            Souastre