gpt4 book ai didi

javascript - 如何遍历数组/将数组映射到返回包含另一个 promise 的 promise 的函数

转载 作者:行者123 更新时间:2023-11-29 22:52:17 26 4
gpt4 key购买 nike

我一直在尝试循环遍历一组项目,以便每个项目都用于返回 promise 的操作,但在该 promise 中还有另一个 promise 。我没有得到想要的流量。我究竟做错了什么?或者,还有更好的方法。由于条件,我不能使用太多链接。我以多种方式尝试了 async/await,结果仍然是相同的不良结果。

为了清晰起见,代码已经过简化。 fetch 调用实际上是数据库操作,但行为仍然相同;在这种情况下,我还使用了单元素数组。

var names = ['mike'];
console.log('black');

var fn = function doThings(name) {
return new Promise((resolve) => {
console.log('blue');

var char = name.substr(1);
getNum(char);
console.log('violet');

function getNum(ch) {
console.log('green');

fetch('fetchfrom.url')
.then(response => {
console.log('orange');

return response.json();
})
.then(n => {

if(n === 2) {
console.log('red1');

fetch('fetchfrom.url')
.then(response => {
console.log('yellow');

return response.json();
}).then(color => {
if(n === 2) {
console.log('red2');

resolve(5);
}
else {
console.log('brown2');

resolve(10);
}
});
console.log('lilac');

} else {
console.log('brown1');

resolve(20);
}

});
}

})


}

var actions = names.map(fn);

Promise.all([actions])
.then(() => {
console.log('done');
})

我希望日志按顺序排列(假设 n 始终等于 2):黑...蓝...绿...橙...红1...黄...红2...淡紫色...紫...完成

但相反,我始终得到:黑色...蓝色...绿色...紫罗兰色...深色...橙色...红色1...黄色...红色2...淡紫色

最佳答案

您需要正确传播 promise 。

  • 您的示例中不需要 new Promise() 构造函数,您需要在执行异步操作时正确调用 .then()
  • 当您在 .then() 处理程序中调用 fetch() 时,返回 promise 以保持 promise 链的完整性。
  • 异步操作后没有代码,例如:fetch().then();,因为之后的代码将立即执行,而不是在 fetch 调用完成后执行。

您可以使用 async/await,您的示例将如下所示:

var names = ['mike'];
console.log('black');

async function getNum(ch) {
console.log('green');
let response = await fetch('fetchfrom.url');
console.log('orange');
let n = await response.json();

if (n === 2) {
console.log('red1');
let res = await fetch('fetchfrom.url');
console.log('yellow');
let color = await res.json();
if (n === 2) {
console.log('red2');
return 5;
} else {
console.log('brown2');
return 10;
}
console.log('lilac');
} else {
console.log('brown1');
return 20;
}
}

async function doThings(name) {
console.log('blue');
var char = name.substr(1);
let num = await getNum(char);
console.log('violet');
return num;
}

var actions = names.map(fn);
Promise.all([actions])
.then(() => {
console.log('done');
});

没有 async/await 并且你只能做简单的 promise :

var names = ['mike'];
console.log('black');

function getNum(ch) {
console.log('green');
return fetch('fetchfrom.url').then(response => {
return response.json();
}).then(n => {
console.log('orange');
if (n === 2) {
console.log('red1');
return fetch('fetchfrom.url').then(res => {
console.log('yellow');
return res.json();
}).then(color => {
if (n === 2) {
console.log('red2');
return 5;
} else {
console.log('brown2');
return 10;
}
}).then(result => {
console.log('lilac');
return result;
});
} else {
console.log('brown1');
return 20;
}
});
}

function doThings(name) {
console.log('blue');
var char = name.substr(1);
return getNum(char).then(num => {
console.log('violet');
return num;
});
}

var actions = names.map(fn);
Promise.all([actions])
.then(() => {
console.log('done');
});

两者都应产生预期的日志顺序。

关于javascript - 如何遍历数组/将数组映射到返回包含另一个 promise 的 promise 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57257812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com