Вот пример, который может дать вам некоторое вдохновение. Код ниже сначала ожидает текст элемента, а затем получает любые цифры из текста. Затем он ожидает разрешения всех элементов, прежде чем сгладить массив (используя reduce
) на один уровень.
// mock for items
class Item {
constructor(value) {
this.value = value;
}
getText() {
return Promise.resolve(this.value);
}
}
let items = ["foo", "bar +12.54", "baz -1.29", "1.23 4.56"]
.map(str => new Item(str));
// answer
(async function () {
let prices = items.map(async item => {
let text = await item.getText();
let prices = text.match(/[+-]?\d+(\.\d+)?/g) || [];
return prices.map(parseFloat);
});
prices = await Promise.all(prices);
prices = prices.reduce((acc, arr) => acc.concat(arr));
console.log(prices);
})();
В качестве альтернативы вы можете упростить это, ожидая сначала всех результатов. Однако, поскольку сопоставление с регулярным выражением и анализ с плавающей точкой независимы для каждого элемента, который я выбрал , а не , чтобы сделать это. Приведенный выше код сопоставит регулярное выражение со строкой, как только обещание разрешится, вместо того, чтобы ждать разрешения всех обещаний, а затем сопоставит каждый элемент с регулярным выражением (как показано ниже).
Код (более компактный, менее оптимальный) для этого будет:
(async function () {
let texts = await Promise.all(items.map(item => item.getText()));
let prices = texts
.map(text => text.match(/[+-]?\d+(\.\d+)?/g) || [])
.reduce((acc, arr) => acc.concat(arr))
.map(parseFloat);
console.log(prices);
})();