Реагировать маршрут без обновления страницы

Если вы хотите синхронную связь между основным потоком и потоком обработки, вы можете использовать SynchronousQueue .

Идея состоит в том, что основной поток передает данные в поток обработки вызвав put(), и поток обработки вызывает take(). Обе операции блокировки.

Обратите внимание, что если вы хотите отправить результат, тогда ситуация может немного усложниться, поскольку основной поток должен знать, когда результат будет готов. A CountDownLatch - хороший примитив для этого. Вы можете сделать что-то вроде этого.

Сначала давайте определим datastructure для передачи данных вокруг:

public class MethodCall {

    public final String methodName;

    public final Object[] args;

    public final CountDownLatch resultReady;

    public Object result;

    public MethodCall(String methodName, Object[] args) {
        this.methodName = methodName;
        this.args = args;
        this.resultReady = new CountDownLatch(1);
    }

    public void setResult(Object result) {
        this.result = result;
        resultReady.countDown();
    }

    public Object getResult() throws InterruptedException {
        resultReady.await();
        return result;
    }
}

Определите очередь для передачи данных вокруг, видимых обоими потоками:

public SynchronousQueue methodCalls = new SynchronousQueue();

Чтобы сделать вызов из основного потока в поток обработки и дождаться результата:

MethodCall call = new MethodCall(methodName, args);
methodCalls.put(call);
Object result = call.getResult();

В потоке обработки, например, в методе run(), вы может тогда сделать:

for (;;) {
    MethodCall call = methodCalls.take();
    Object res = processStuff(call.methodName, call.args);
    call.setResult(res);
}

Где processStuff реализует вашу логику. Конечно, вы также должны иметь дело с исключениями, заниматься случаями выхода, изменять MethodCall, чтобы иметь более конкретные вещи, чем methodName и args и Object return и т. Д.

-2
задан Extelliqent 11 March 2019 в 20:33
поделиться

1 ответ

Вы должны использовать компонент LInk, а не a, если вы хотите, чтобы браузер-маршрутизатор управлял вашей навигацией, как показано здесь.

https://reacttraining.com/react-router/web/api/Link/to-string

<Link
  to={{
    pathname: "/courses",
    search: "?sort=name",
    hash: "#the-hash",
    state: { fromDashboard: true }
  }}
/>
0
ответ дан Dvid Silva 11 March 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: