2

我试图将功能转换为任务。这是原始代码:

称呼:

this.socketConnect(endpoint, token);

功能:

socketConnect = async (token, endpoint) => {
        this.socket = new WebSocket(endpoint + '?auth=' + token);

        this.socket.addEventListener('open', () => {
                this.socket.addEventListener('message', event => this.handleMessage(event));

                this.socket.addEventListener('close', event => this.retryConnection(event, endpoint));

        });
    }

我一直在遵循实施 Ember 任务的结构。它全部编译没有问题,但是当它被调用时,它输出 this.socketConnect(...) 不是一个函数。之前我没有下面的返回,它输出 this.socketConnect 不是一个函数。这是我当前的任务代码。

进口:

import { task } from 'ember-concurrency';

称呼:

this.socketConnect(endpoint, authToken).perform();

功能:

@task *socketConnect(endpoint, token) {
        yield async () => {
            this.socket = new WebSocket(endpoint + '?auth=' + token);
            this.socket.addEventListener('open', () => {
                this.socket.addEventListener('message', event => this.handleMessage(event));

                this.socket.addEventListener('close', event => this.retryConnection(event, endpoint));
            });

            return;
        };

    }

对此很陌生,所以我猜我缺少一些小东西。它与其他用途相匹配。另外,是否有人可以帮助将 websocket 生成功能切换为任务的好处?任何帮助将不胜感激,谢谢。

4

1 回答 1

4

@task装饰器还不是官方ember-concurency包的一部分。官方版本目前存在于ember-concurrency-decorators中。你需要 ember install ember-concurrency-decorators

然后你可以做

import { task } from 'ember-concurrency-decorators';

使用它。

或者,如果您不想要另一个依赖项,您可以使用不同的语法。

import { task } from 'ember-concurrency';

class Foo {
  @(task(function*() {
    // ...
  }).restartable())
  doStuff;

  executeTheTask() {
    this.doStuff.perform();
  }
}

调用任务的语法是: this.socketConnect.perform(endpoint, authToken);

由于您没有直接调用 socketConnect,因此您希望调用 ember 并发为您生成的方法。

于 2020-05-18T21:42:24.817 回答