Как мне запустить XHR на компоненте MouseClick, используя CalmmJS и React? - PullRequest
0 голосов
/ 28 июня 2018

Я хочу запустить XHR.perform onMouseClick, используя CalmmJS и React - я пытаюсь следующий код, ненужные части отредактированы:

const getResults = someArg => XHR.perform({
    timeout: 60 * 1000,
    responseType: 'json',
    method: 'POST',
    url: U.string`/api/${ facet }/end-point/`,
    body: U.stringify( someArg )
});
...
<SomeElement
    ...
    onMouseClick={ U.ifElse(
            shouldMakeXHR, /* Atom that runs its own debounced XHR checks, then
                              runs it through an R.equals to see if the result
                              is acceptable - result is either true or false */
            _ => getResults( someArg ),
            R.identity //as no-op
    ) }
/>

В настоящее время я просто пытаюсь инициировать сетевой запрос, ничего не делая с результатом. Вместо этого XHR.perform просто проглатывается без следа. Что я делаю не так?

PS: Пожалуйста, кто-то может пометить мой пост с помощью karet или karet.util, так как я не могу создать теги. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 29 июня 2018

Это еще один базовый вопрос, против которого я почему-то продолжал биться головой.

Ответ заключается не в использовании обычной функции, а в использовании библиотеки karet.util и U.doPush значения для потока U.bus(). Официальная документация CalmmJS фактически указывает на действительно ясный и простой пример , демонстрирующий такое поведение . U.doSet значение для обычного U.atom(), хотя я начинаю думать, что должен быть лучший способ ... обновлю этот ответ, если найду его.

Есть лучший способ! Прямо от Весы Карвонен / @ polytypic себя:

const requestsBus = U.bus()

const xhrProperty = XHR.perform(U.toProperty(requestsBus)) 

<button
  onClick={U.doPush(requestsBus, {
        timeout: 60 * 1000,
        responseType: 'json',
        method: 'POST',
        url: U.string`/api/${ facet }/end-point/`,
        body: U.stringify( someArg )
})}>
  Request!
</button>

Вот оригинальный почти рабочий код, для потомков - НЕ ИСПОЛЬЗУЙТЕ КОД НИЖЕ ЭТОЙ ЛИНИИ - СМОТРИТЕ ВЫШЕ

const mouseClick = U.atom( false );
const makeRequest = someArg => XHR.perform({
timeout: 60 * 1000,
responseType: 'json',
method: 'POST',
url: U.string`/api/${ facet }/end-point/`,
body: U.stringify( someArg )
});
const getResponse = U.when( mouseClick,
    XHR.responseFull( makeRequest( someArg ) );
...
<p>{ U.stringify( getResponse ) }</p>
<SomeElement
...
    onClick={ U.ifElse(
        shouldMakeXHR, /* Atom that runs its own debounced XHR checks, then
                          runs it through an R.equals to see if the result
                          is acceptable - result is either true or false */
        U.doPush( mouseClick, true ),
        R.identity //as no-op
) }
/>

Обратите внимание, что он будет продолжать отправлять запросы XHR после каждого изменения арги после первого щелчка мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...