Проблемы с обещаниями в JavaScript - PullRequest
0 голосов
/ 26 февраля 2019

Я новичок.Буду благодарен за помощь.Последняя строка кода не работает.Не знаю как это исправить.Я понимаю, что второе "затем" должно возвращать resolv (), но как это реализовать

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

1 Ответ

0 голосов
/ 26 февраля 2019

Избегайте использования 1002 * конструктора antipattern !Это нормально, чтобы new Promise обернуть EthereumNote.getMyNote, это не нормально, чтобы обернуть цикл.Вы никогда не resolve() это внешнее обещание.

Вместо этого просто верните цепочку обещаний, которую вы создали в 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);
});
...