Почему я не могу выдвинуть значение в массив вне функции? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть функция:

static async assign( assigned_data, assigned_by ) {
    return new Promise( async ( resolve, reject ) => {
        let orders = [];
        await assigned_data.map( async( data ) => {

            // find each order and update 
            await data.assigned.map( async( order_id ) => {
                await this.findByIdAndUpdate( order_id, {
                    $set: { 
                        current_assigned: { 
                            user: data._id,
                            assigned_by: assigned_by,
                        },
                        last_assigned_at: Date.now(),
                        last_assigned_by: assigned_by,
                    },
                    $addToSet: { 
                        assigned_history: { 
                            user: data._id,
                            assigned_by: assigned_by,
                        } 
                    },
                }, ( error, order ) => {
                    if ( error ) {
                        console.log( 'error', error );
                    }
                    console.log( 'order', order );
                    orders.push( order );
                } );
            } );
        } );
        resolve( orders );
    } );
}

Even console.log ('order', order);Распечатайте заказ, но я не могу передать его в массив ордеров.

Но массив ордеров по-прежнему пуст, когда я использую эту функцию.

Когда я использую setTimeout, он извлекает то, что мне нужно.

setTimeout(function() {
          resolve( orders );
        }, 1000);

Я не хочу использовать setTimeout, потому что я не знаю, сколько времени установить (например, 1000 мс в приведенном выше коде).

Пожалуйста, скажите мне, что не так с моимкод.Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы все усложняете. Вложение асинхронного ожидания не очень хорошая идея, так как его трудно отладить.

Есть несколько проблем. Давайте посмотрим на рабочий образец.

async function assign(assigned_data) {
  let orders = [];
  orders = await Promise.all(assigned_data.map(async(data) => {
    // find each order and update 
    return await Promise.all(data.map(async(order_id) => {
      return await call();
    }))
  }));
  console.log(orders);
}

async function call() {
  var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log('order');
      resolve('order');
    }, 2000);
  });
  return promise;
}

data = assign([
  [1, 2, 3],
  [1, 2, 3]
])

Прежде всего вам нужно Promise.all, чтобы дождаться Promise s , образованного map.

Во-вторых, ваше задание на вложение все еще содержит другой массив (я полагаю, таким образом, вы снова используете map). Таким образом, вам все еще нужен еще один Promise.all внутри предыдущего Promise.all. (Пожалуйста, не делайте этого снова для даже сложной структуры)

Наконец, поместите настоящего работника за пределы своего цикла вложения async-await.

0 голосов
/ 07 сентября 2018

Я думаю, просто обратный звонок!но я не проверяю это.хм ..

static async assign(assigned_data, assigned_by) {
    const orders = [];
    return new Promise( async ( resolve, reject ) => {
        assigned_data.map((data, index) => {
            data.assigned.map((order_id) => {
                this.findByIdAndUpdate(order_id, {
                    $set: {
                        current_assigned: {
                            user: data._id,
                            assigned_by: assigned_by,
                        },
                        last_assigned_at: Date.now(),
                        last_assigned_by: assigned_by,
                    },
                    $addToSet: {
                        assigned_history: {
                            user: data._id,
                            assigned_by: assigned_by,
                        }
                    },
                }, 
                (error, order) => {
                    error ? console.log('error', error) : console.log('order', order);
                    orders.push(order);

                    if(index === assigned_data.length-1) {
                        resolve(orders); // just callback
                    }
                });
            });
        });
    });
}

Извините, я не вижу петли ..

Вы можете это. Javascript Map Array Последний элемент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...