这是一个异步对象方法

时间:2017-05-23 19:35:08

标签: javascript async-await this babeljs ecmascript-2017

我使用babel-polyfill / babel-preset-es2017创建了一个使用异步函数方法的对象,但是我遇到了this的问题:

let obj = () => {
    return {
        doAsync: async () => {
            let thing = await longProcess()
            return this.transform(thing)
        },

        transform: (thing) => {
            return psuedoCodeTransform(thing)
        }
    }
}

let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.

这是ES2017中描述的东西,一个babel-polyfill / regeneratorRuntime陷阱吗?

2 个答案:

答案 0 :(得分:2)

Arrow functions do not create their own context。他们没有自己的this,而this将引用封闭范围的上下文。在这种情况下(没有双关语),this根本不会引用与instance相同的对象。

如果您在this内记录doAsync,您会发现它是全球window

答案 1 :(得分:1)

Joseph the the Dreamer的回答显然是正确的,但由于我最好通过示例,这里是你的代码改变了应该使它工作。请注意,唯一的变化实际上是将doAsync定义为普通函数而不是箭头函数:

let obj = () => {
    return {
        doAsync: async function() {
            let thing = await longProcess()
            return this.transform(thing)
        },

        transform: (thing) => {
            return psuedoCodeTransform(thing)
        }
    }
}

let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.