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
    yesterday










  • @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

















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
    yesterday










  • @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















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 11 hours ago

























asked 2 days ago









bart

1318




1318












  • Where is arrayOfFiles defined?
    – guest271314
    yesterday










  • @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




















  • Where is arrayOfFiles defined?
    – guest271314
    yesterday










  • @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


















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












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 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
    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 chain








    share|improve this answer

























      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 chain








      share|improve this answer























        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 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 4 hours ago









        guest271314

        1215




        1215






























             

            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

            404 Error Contact Form 7 ajax form submitting

            How to know if a Active Directory user can login interactively

            TypeError: fit_transform() missing 1 required positional argument: 'X'