Чтобы добавить к вопросу Стивена, а не рассуждать по-другому, важно , почему десятичный разделитель .
.
Если это потому, что источник находится на компьютере -readable format, где разделитель десятичного числа периода указан как часть спецификации документа, тогда я бы пошел именно так, как это делает Стивен, используя CultureInfo.InvariantCulture
.
Если это человеческий ввод в определенном языке, тогда вы хотел бы сопоставить этот язык с CultureInfo
, подходящим для этого языка, иначе, если программное обеспечение используется с другим языком, у вас будет точно противоположная проблема. Как правило, вы хотите установить для потока CurrentCulture
этот поток (CurrentCulture
для форматов, CurrentUICulture
для языков). Если вы это сделали, вам не нужно передавать культуру вообще, так как форма float.Parse(string)
использует эту культуру, однако вы можете использовать float.Parse(string, CurrentCulture)
, чтобы быть явным, что это то, что вы делаете (и заткнуть некоторый программный анализ, который жалуется, когда вы не являетесь конкретным таким образом).
Что становится действительно сложным, если вам потенциально приходится принимать как период, так и запятую - не в последнюю очередь потому, что многие культуры которые используют период как десятичный разделитель, используют запятую как разделитель тысяч, и в конечном итоге невозможно гарантировать однозначный синтаксический анализ. Однако, предполагая, что проблема с тысячами не влияет на вас, тогда код, который вы дали в своем вопросе, - это подход, хотя я бы рекомендовал сделать противоположное (заменить запятую на период), а затем разобрать инвариантную культуру, поскольку это удаляет любые дальнейшие осложнения, вызванные еще большим изменением культуры.
Вы не можете сделать это, как вы себе представляете, потому что вы не можете использовать await
, если он не находится непосредственно внутри функции async
.
Разумная вещь здесь сделать функцию, переданную в map
асинхронной. Это означает, что map
вернет массив обещаний. Затем мы можем использовать Promise.all
, чтобы получить результат, когда все обещания вернутся. Поскольку сам Promise.all
возвращает обещание, внешняя функция не должна быть async
.
const someFunction = (myArray) => {
const promises = myArray.map(async (myValue) => {
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
return Promise.all(promises);
}
Я считаю, что это потому, что функция из map
не является async , поэтому вы не можете ждать в ее возвратной инструкции. Он компилируется с этой модификацией:
const someFunction = async (myArray) => {
return myArray.map(async (myValue) => { // <-- note the `async` on this line
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
};
Итак ... невозможно дать рекомендации, не видя остальной части вашего app, но в зависимости от того, что вы пытаетесь сделать, либо сделайте функцию inner асинхронной, либо попытайтесь создать некоторую другую архитектуру для этого блока.
Обновление: мы могли бы получить на следующий день ожидается следующий уровень: https://github.com/MylesBorins/proposal-top-level-await
[{}, {}]
). Я думаю, что мне нужно включить где-то await
, но не мог понять, где
– MyTitle
27 February 2017 в 17:13
return await Promise.all(myArray.map
... для эквивалентности.
– jib
27 February 2017 в 22:33
service.getByValue
, что вполне может включать сетевой вызов ... – lonesomeday 3 March 2018 в 16:23