Saber Promise.all tem a capacidade de executar tarefas assíncronas simultâneas. Mas seu maior problema é que, se uma dessas anormalidades tarefas (rejeitar), todas as tarefas irá travar, Promise diretamente para o estado de rejeição.
Imagine este cenário: Sua página tem três regiões, correspondentes aos três dados de interface independentes, concorrente uso Promise.all a três interfaces, um serviço de interface se qualquer um o estado anormal é rejeitar, o que pode levar a três páginas todos os dados regionais não pode ser processado porque rejeitar qualquer retirada entrará na captura, obviamente, isso é inaceitável, como segue:
Promise.all([
Promise.reject({code: 500, msg: '服务异常'}),
Promise.resolve({ code: 200, list: []}),
Promise.resolve({code: 200, list: []})
])
.then((ret) => {
// 如果其中一个任务是 reject,则不会执行到这个回调。
console.log(res)
RenderContent(ret);
})
.catch((error) => {
// 本例中会执行到这个回调
console.log(error)
// error: {code: 500, msg: "服务异常"}
})
vantagem Promise.allSettled
precisamos de um mecanismo, se tarefas simultâneas, seja uma tarefa normal ou anormal, retorna o status correspondente (cumprida ou rejeitado) e resultados (devido ao valor do negócio ou rejeitar razão), em seguida, passe interior de filtro no lógica de negócios para filtrar o resultado desejado, a acessibilidade deste negócio será capaz de maximizar a proteção do estado actual e Promise.allSettled é para resolver este problema.
Promise.allSettled([
Promise.reject({code: 500, msg: '服务异常'}),
Promise.resolve({ code: 200, list: []}),
Promise.resolve({code: 200, list: []})
])
.then((ret) => {
/*
0: {status: "rejected", reason: {...}}
1: {status: "fulfilled", value: {...}}
2: {status: "fulfilled", value: {...}}
*/
// 过滤掉 rejected 状态,尽可能多的保证页面区域数据渲染
RenderContent(ret.filter((el) => {
console.log(el)
return el.status !== 'rejected';
}));
});
ES2020 oferece uma maneira fácil: String.prototype.matchAll, que retorna um iterador
var str = '<text>JS</text><text>正则</text>';
var allMatchs = str.matchAll(/<\w+>(.*?)<\/\w+>/g);
for (const match of allMatchs) {
console.log(match);
}
/*
第一次迭代返回:
[
"<text>JS</text>",
"JS",
index: 0,
input: "<text>JS</text><text>正则</text>",
groups: undefined
]
第二次迭代返回:
[
"<text>正则</text>",
"正则",
index: 15,
input: "<text>JS</text><text>正则</text>",
groups: undefined
]
*/