Typescript: необходимо объявить const в глобальной области чтения из асинхронной функции - PullRequest
0 голосов
/ 15 октября 2018

получил один вопрос новичка здесь.Мне нужно объявить const на верхнем уровне моего файла Typescript , чтобы он был доступен для всех функций ниже.Проблема в том, что значение, которое мне нужно присвоить этой константе, возвращается асинхронной функцией, и именно здесь я застрял.Асинхронную функцию нельзя вызвать с верхнего уровня - я могу сделать что-то подобное, но в этом случае константа больше не находится на верхнем уровне и не может быть доступна другим функциям.

(async () => {
    const myConst = await asyncFunction(params);
})(); 

другой вариант - использовать let вместо const, вот так, но у меня там был const

let myConst;
(async () => {
    myConst = await asyncFunction(params);
})();

Не могли бы вы посоветовать мне?Есть ли какой-то выход из этого положения, чтобы я мог объявить const для глобальной области видимости и присвоить ей значение на основе асинхронной функции?

Большое спасибо:)

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Проблема в том, что поскольку операция, предоставляющая значение, является асинхронной, другие функции в вашем модуле могут попытаться использовать переменную / константу до того, как ее значение будет установлено.Так что лучше избегать этого, возможно, делая то, что предлагает Джесси Халлетт , и заставляя другие функции в модуле использовать обещание.

Если вы не можете этого избежать,и вы точно знаете, что эти функции не будут вызваны до того, как асинхронная операция вернет значение, используйте опцию let, инициализирующую переменную с null или некоторым другим значением флага, и проверьте это значение флага в функциях, которыеякобы не звонят, пока он не будет готов и их бросят.Например:

let myConst = null; // null or some other value that isn't valid for this
(async () => {
    try {
        myConst = await asyncFunction(params);
    } catch (e) {
        // Handle the fact the async function failed -- don't skip this!
    }
})();

function assumeMyConst() {
    if (myConst === null) {
        throw new Error("State error: myConst not available yet");
    }
}

function foo() {
    assumeMyConst();
    // ...
}

Но опять же, если возможно, избегайте этого.


Примечание: обратите внимание на проверку ошибок в этом async IIFE.Не пропускайте проверку ошибок.: -)

0 голосов
/ 15 октября 2018

Использование асинхронного результата в переменной верхнего уровня проблематично, поскольку нет статической гарантии того, что результат будет готов, когда функции в вашем модуле попытаются прочитать значение.На мой взгляд, правильный и безопасный способ сделать это - присвоить обещание переменной верхнего уровня и сделать любую функцию, которая читает значение await, результатом:

const myConst = asyncFunction(params);

async function example() {
  doStuff(await myConst);
}

Но если этоважно, чтобы асинхронный результат был в переменной верхнего уровня, и у вас есть какой-то способ гарантировать, что значение будет готово до того, как оно будет прочитано, тогда я бы пошел с вашим присваиванием let.Я не думаю, что есть какой-то хороший способ сделать эту переменную const в этом случае.

0 голосов
/ 15 октября 2018

Поскольку myConst получает свое значение после завершения кода async, оно имеет тип Promise.Следовательно, ваша декларация должна быть довольно простой:

declare const myConst: Promise<any> // or type of the value instead of any

Используйте ее в любом месте, например так:

myConst.then((v) => console.log(v))

PS Мой личный совет - по возможности использовать модули (импорт / экспорт).Глобальные переменные - это запах кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...