我正在for循环内使用async等待,如下所示。
for (let i = 0; i < result.length; i += 1) {
try{
const client = await axios.get(
`${process.env.user}/client/${result[i].id}`
);
} catch(error){
console.log(error)
}
if (client.data.success === true) {
result[i].Name = rider.data.client.Name;
result[i].PhoneNumber = rider.data.client.Number;
}
}
但是我想使用'new Promise'和'promiss.all'使其异步。
但是我不知道如何正确处理错误。
您能为此建议一些建议吗?感谢您阅读。
答案 0 :(得分:0)
尝试一下
var promises = result.map(r => axios.get(`${process.env.user}/client/${r.id}`);
Promise.all(promises).then(function(values) {
console.log('All promises done');
});
想法是,如果您正在等待某事,那就是承诺,您可以等待它,也可以调用它来获取承诺
示例:
function Foo()
{
return new Promise(...); // Promise of int for example
}
你可以做
var p = Foo(); //you will get promise
或
var v = await Foo(); // you will get int value when promise resolved
答案 1 :(得分:0)
使用async/await
+ Promise.all
的方法是这样的:
const myResult = await Promise.all(result.map(({ id }) => {
return axios.get(`${process.env.user}/client/${id}`);
}));
// deal with the result of those requests
const parsed = myResult.map(data => /* your code here */);
答案 2 :(得分:0)
以下是使用Array.map
和Promise.all
一起调用函数的示例。我将axios请求包装在一个函数中,因此,如果您的一个请求失败,它将不会停止其他所有请求。如果您不介意在遇到问题时停下来,请看看其他人对您问题的回答。
function fakeRequest() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
data: {
success: true,
client: {
Name: 'Todd',
Number: 5,
},
},
});
}, 300);
});
}
(async() => {
const result = [{}, {}, {}];
await Promise.all(result.map(async(x, xi) => {
try {
const client = await fakeRequest();
if (client.data.success === true) {
result[xi].Name = client.data.client.Name;
result[xi].PhoneNumber = client.data.client.Number;
}
} catch (err) {
console.log(err)
}
}));
console.log(result);
})();
答案 3 :(得分:0)
我认为这可能是一个基本的解决方案
await Promise.all(result.map(async r => {
let client;
try {
client = await axios.get(`${process.env.user}/client/${r.id}`);
} catch (error) {
console.log(error)
}
if (client.data.success === true) {
r.Name = rider.data.client.Name;
r.PhoneNumber = rider.data.client.Number;
}
}));
这也可以通过使用foreach循环来完成。 使用映射函数可以简化for / foreach循环。 js map函数等效于c#select linq函数。 与c#select内部函数必须返回一个值不同,js map函数中的粗箭头未必会返回一个值。
{{1}}