为什么我不能将值推送到函数外部的数组?

时间:2018-09-07 08:59:52

标签: javascript promise

我有一个功能:

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 );
    } );
}

甚至console.log('order',order);打印出订单,但是我不能将其推送到orders数组。

但是当我使用此功能时,orders数组仍然为空。

当我使用setTimeout时,它会提取出我想要的内容。

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

我不想使用setTimeout,因为我不知道要设置多少时间(例如,上述代码中的1000毫秒)。

请告诉我我的代码有什么问题。非常感谢您!

2 个答案:

答案 0 :(得分:0)

我认为,只需回调即可! 但是,我不对此进行测试。嗯..

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 Last Item

答案 1 :(得分:0)

您正在使事情变得复杂。嵌套异步等待不是一个好主意,因为它很难调试。

有几个问题。让我们看一个工作示例。

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组成的map s

第二,您的嵌套作业仍然包含另一个数组(我认为,因此您再次使用map)。因此,您仍然需要在上一个Promise.all中使用另一个Promise.all。 (对于复杂的结构,请不要再次执行此操作)

最后,将真正的工作人员置于嵌套的async-await循环之外。