Проблема не относится к Unstated, это относится и к контекстному API React, в котором также используется шаблон рендеринга.
Проблема с login
заключается в том, что его поток управления имеет недостатки. Он не сможет эффективно отлавливать ошибки, потому что он их подавляет. И оно заключает в себе обещание внутри, что является ошибкой, которая мешает его должным образом проверить, для начала
Может выставлять обещание или принимать обратный вызов, или оба:
login = async (cb) => {
...
return axios(...)
.then(function(result) {
if (cb)
cb(result);
return result;
})
.catch(error => console.log('error:', error));
}
Может использоваться как:
<button onClick={() => login(() => counter.decrement())}>-</button>
Или:
<button onClick={async () => { await login(); counter.decrement(); }}>-</button>
Также можно сделать login
принять counter
в качестве аргумента, но это связало бы его с реализацией, которая не нужна.