два обещания с внутри - PullRequest
       13

два обещания с внутри

0 голосов
/ 05 ноября 2018

У меня есть два обещания в цепочке, например:

router.get('/:address', function (req, res, next) {

    let prodotti = [];

    istanza.methods.getProductByOwner("xxxxx").call().then(
        ids => {
            for (let id of ids) {
                istanza.methods.prodotti(id).call().then(
                    prod => {
                        prodotti.push(prod);
                    },
                    error => console.dir(error)
                )
            }
        },
        err => console.log("ritiro KO " + err)
    );

    res.render('profilo', {address: req.params.address, prodotti: prodotti});

});

Я хочу заполнить prodotti, когда закончится for.

Я пытаюсь так:

router.get('/:address', function (req, res, next) {
    let prodotti = [];

    istanza.methods.getProductByOwner("xxxx").call().then(
        ids => {
            f(ids)
        },
        err => console.log("ritiro KO " + err)
    );
    res.render('profilo', {address: req.params.address, prodotti: prodotti});

});

, а затем

async function f(ids) {
    let prodotti = [];
    let promises = []

    promises.push(new Promise((resolve, reject) => {
        for (let id of ids) {
            promises.push(istanza.methods.prodotti(id).call().then(
                prod => {
                    prodotti.push(prod);
                    //resolve when for is finished
                    if(id == (ids.length)-1){
                        resolve(prodotti)
                    }
                    id++;
                },
                error => console.dir(error)
            ));
        }

    }));

    let result = await Promise.all(promises);
    console.log("await " + result);
}

но мой результат:

,,, [объект Object], [объект Object], [объект Object]

Я хочу получить результат только тогда, когда завершено, и я не люблю использовать условие, подобное этому:

if(id == (ids.length)-1)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

кажется, вам нужно правильно обработать ваше обещание от первоначального рендера API:

router.get('/:address', async (req, res, next) => {   
    let ids = await istanza.methods.getProductByOwner("xxxx").call().catch(err => 
        console.log("ritiro KO " + err)
    );
    let prodotti = await Promise.all(ids.map( async f ));
    res.render('profilo', {address: req.params.address, prodotti: prodotti});

});

Ваша другая функция может обрабатывать каждый идентификатор индивидуально:

function f(id) {
    return istanza.methods.prodotti(id).call().catch(console.dir)
}

Я предположил, что несколько вещей, таких как метод .call(), возвращает обещание (из синтаксиса, похоже, так и есть). ВНИМАНИЕ, этот код не проверен!

ПРИМЕЧАНИЕ: Обновлено с комментарием Берги

0 голосов
/ 05 ноября 2018

Вы должны перебрать каждое значение идентификатора и поместить обещание в массив, а затем дождаться разрешения всех обещаний. После разрешения вы можете получить ответ в result и вставить его в prodotti.

Попробуйте это

let promises = [];
async function f(ids) {

    for (let id of ids) {
       var promise = istanza.methods.prodotti(id).call().then(
                prod => {
                   return prod;
                },
                error => return error;
            );
        promises.push(promise);    
  }
    let prodotti = await Promise.all(promises);
    console.log("await " + prodotti);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...