Search code examples
javascriptecmascript-6es6-promise

Problems with promises in JavaScript


The last line of code doesn't work and I don't know how to fix it. I understand that second "then" has to return resolve() but how can I realize it?

let getNumber = new Promise((resolve) => {
    //API
    EthereumNote.getAmountOfMyNotes(function(error, result) {
        if (!error) {
            let AmountOfMyNotes = Number(result)
            resolve(AmountOfMyNotes)
            console.log(result)
        } else
            console.error(error)

    })
}).then(result => {
    return new Promise((resolve) => {
        for (let i = 0, p = Promise.resolve(); i < result; i++) {
            p = p.then(_ => new Promise(resolve => {
                //API
                EthereumNote.getMyNote(i, function(error, result) {
                    if (!error) {
                        let text = String(result[0])
                        let noteID = Number(result[1])
                        console.log(text)
                        console.log(noteID)
                        resolve()
                    } else
                        console.error(error)
                })
            }));
        }
    })
}).then(() => console.log('Hi!')) // this one doesn't work

Solution

  • Avoid the Promise constructor antipattern! It's ok to make a new Promise to wrap EthereumNote.getMyNote, it's not ok to wrap the loop. You never resolve() that outer promise.

    Instead, just return the promise chain you created in p:

    let getNumber = new Promise((resolve) => {
        //API
        EthereumNote.getAmountOfMyNotes(function(error, result) {
            if (error) reject(error);
            else resolve(Number(result));
        })
    }).then(amountOfMyNotes => {
        console.log(amountOfMyNotes);
        var p = Promise.resolve();
        for (let i = 0; i < amountOfMyNotes; i++) {
            p = p.then(_ => new Promise((resolve, reject) => {
                //API
                EthereumNote.getMyNote(i, function(error, result) {
                    if (error) reject(error);
                    else resolve(result);
                });
            })).then(result => {
                let text = String(result[0])
                let noteID = Number(result[1])
                console.log(text)
                console.log(noteID))
            });
        }
        return p;
    }).then(() => {
        console.log('Hi!'); // this one now works
    }, err => {
        console.error(err);
    });