2

我实际上是 JavaScript 新手。所以这是我的问题。

从我学到的。我可以在自调用函数( Example1 )中创建一个公共函数(getHello )另一个自调用函数(Example2)调用创建的公共函数,如下所示:-

// 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的任何私有“数据”共享给任何其他自调用函数,只要我创建一个公共函数来启用数据共享。

无论如何,考虑到这一点。我想为什么不创建一个专用的自调用函数来处理从 API 获取的任何数据。所以要做到这一点,我需要将async放在自调用函数中,以便使用 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 is not a function"

我试过在谷歌上搜索答案或任何解释。但我似乎找不到任何相关主题来讨论我在这里说明的内容。

所以问题是;-

1) 异步自调用函数可以完全返回公共函数吗?或者我根本不应该或不建议这样做?

2)如果可以/不能,那为什么?

任何帮助,将不胜感激!

4

1 回答 1

1

async函数返回Promise对象。在给定的示例中,Example1将是一个Promise对象,而不是纯对象。

所以如果你想使用它,你必须使用thenawait获取promise中的值。

这将按预期工作:

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);
于 2020-03-03T03:16:04.207 回答