我有一个功能:
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毫秒)。
请告诉我我的代码有什么问题。非常感谢您!
答案 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
}
});
});
});
});
}
对不起,我看不到循环。
答案 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循环之外。