我有与此结构类似的代码。似乎我在这里不需要异步函数,但是就像我说的那样,它与我自己的代码很长。
这是我的代码:
const array = [
{ methods: 'user.js'},
{ methods: 'test.js'},
{ methods: 'hello.js' },
];
async function bigTest() {
async function details() {
const arr = [];
const test = [];
const files = array.map(async (i) => {
arr.push({
name: i,
item: [
{
name: 'test',
},
],
});
return test.push(arr);
});
return Promise.all(files);
}
const result = await details();
console.log(JSON.stringify(result));
}
bigTest();
每次推入数组的过程,console.log(arr)
都会为我返回:
[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] } ]
[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] },
{ name: { methods: 'test.js', item: [] }, item: [ [Object] ] } ]
[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] },
{ name: { methods: 'test.js', item: [] }, item: [ [Object] ] },
{ name: { methods: 'hello.js', item: [] }, item: [ [Object] ] } ]
我想返回带有所有推入元素的最后一个数组,但结果是[1,2,3]
当我在阵列测试中执行console.log时,我得到了重复的对象
答案 0 :(得分:2)
我想返回带有所有推入元素的最后一个数组,但结果是
[1,2,3]
来自MDN:
push()方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
因此,您需要返回元素本身,而不是test.push(arr)
的结果。将return test.push(arr)
替换为:
test.push(arr);
return test[test.length-1];
然后console.log
仅result
中的最后一项:
console.log(JSON.stringify(result[result.length-1]));
const array = [
{ methods: 'user.js', item: [] },
{ methods: 'test.js', item: [] },
{ methods: 'hello.js', item: [] },
];
async function bigTest() {
async function details() {
const arr = [];
const test = [];
const files = array.map(async (i) => {
arr.push({ name: i, item: [{ name: 'test' }] });
test.push(arr);
return test[test.length-1];
});
return Promise.all(files);
}
const result = await details();
console.log(JSON.stringify(result[result.length-1]));
}
bigTest();
我假设您将arr
和test
用于其他用途,否则,可以通过除去中间数组并记录整个结果数组来简化代码:
const array = [
{ methods: 'user.js', item: [] },
{ methods: 'test.js', item: [] },
{ methods: 'hello.js', item: [] },
];
async function bigTest() {
async function details() {
return Promise.all(array.map(async (i) =>
({ name: i, item: [{ name: 'test' }] })
));
}
const result = await details();
console.log(JSON.stringify(result));
}
bigTest();
答案 1 :(得分:1)
return test.push(arr);
不给您arr
,而是给您新的长度test
。您的files
将是整数的承诺,而您的result
将是整数的数组。
此外,您将创建一个数组arr
和一个数组test
,您要反复将arr
推入其中。似乎不需要任何嵌套,因此不要多次push
。
您可以选择return test
或return arr
,但实际上您不应该自己push
设置这些值。 map
已经为您创建了新数组,您只需要从回调中返回各自的值即可:
async function bigTest() {
const filePromises = array.map(async (i) => {
// I assume you await something here, otherwise the `async` is really unnecessary
return {
// ^^^^^^
name: i,
item: [
{
name: 'test',
},
],
};
});
const files = await Promise.all(filePromises);
console.log(JSON.stringify(files));
}
答案 2 :(得分:0)
此行:
return test.push(arr);
返回test
数组的新长度,该长度是1乘2然后是3,因此文件数组最终包含[1,2,3]
您可能要替换:
return Promise.all(files);
具有:
return Promise.all(files).then(() => arr);
它将执行promise,然后返回arr数组的内容。
或者,我不确定您要做什么,但是您可以简化为:
async function bigTest() {
async function details() {
const files = array.map(async (i) => {
return {
name: i,
item: [
{
name: 'test',
},
],
};
});
return Promise.all(files);
}
const result = await details();
console.log(JSON.stringify(result));
}
bigTest();