Функция Self Invoking Asyn c возвращает функции publi c - PullRequest
2 голосов
/ 03 марта 2020

Я на самом деле новичок в JavaScript. Итак, вот мой вопрос.

Из того, что я узнал. Я могу создать функцию publi c ( getHello ) внутри функции самостоятельного вызова ( Example1 ) и вызвать созданную функцию publi c из другой функции самостоятельного вызова ( Пример 2 ), как показано ниже: -

// first self-invoke function
const Example1 = (() => {
    // daclare var to hold Hello World
    let hello = 'Hello World'

    return {
        // create public function to passed 'Hello World'
        getHello: () => {    
            return hello
        }
    }
})();

// second self-invoke function - receive 1 argument (Example1 function)
const Example2 = ((e1) => {
    // declare new var
    let newHello = e1.getHello()
    console.log(newHello) // will Output: Hello World

})(Example1);

Я пробовал приведенный выше код, и это удивительно. Никогда не знал, что JavaScript может быть так весело! Это означает, что я в основном могу поделиться любыми частными «данными» внутри Example1 с любыми другими функциями самовывоза, если я создаю функцию publi c для включения обмена данными.

Во всяком случае, с учетом этого. Я подумал, почему бы мне не создать выделенную самовывозную функцию для обработки любого извлечения данных из API . Поэтому для этого мне нужно поместить asyn c в функцию самостоятельного вызова, чтобы использовать await для извлечения json данных (как показано ниже)

// first async self-invoke function
const Example1 = (async() => {
    // get data from API fetch
    let res = await fetch(API_URL)
    let json = await res.json()
    let hello = json

    return {
        // create public function to passed 'Hello World'
        getHello: () => {    
            return hello
        }
    }
})();

// second self-invoke function - receive 1 argument (Example1 function)
const Example2 = ((e1) => {
    // declare new var
    let newHello = e1.getHello() // error occurs here
    console.log(newHello)

})(Example1);

Но, к сожалению, благодаря этому. Это дало мне эту ошибку, сказав "e1.getHello не является функцией" .

Я попытался найти ответ или любое объяснение в Google. Но я не могу найти каких-либо актуальных топи c, обсуждающих то, что я просто иллюстрирую здесь.

Так что вопросы будут; -

1) Может ли асинхронная c функция самовызова вообще вернуть функцию publi c? или я не должен или не рекомендовал бы делать это вообще?

2) Если можете / не можете, то почему?

Любая помощь будет признательна!

1 Ответ

1 голос
/ 03 марта 2020

async функция возвращает Promise объект. В данном примере Example1 будет Promise объектом, а не чистым объектом.

Поэтому, если вы хотите его использовать, вы должны использовать then или await, чтобы получить значение в обещание.

Это будет работать как ожидалось:

const Example1 = (async() => {
    let res = await fetch(API_URL)
    let json = await res.json()
    let hello = json

    return {
        getHello: () => {    
            return hello
        }
    }
})();

const Example2 = (async (e1) => {
    el = await e1; // **** THIS IS KEY POINT ****
    let newHello = e1.getHello()
    console.log(newHello)
})(Example1);
...