Я объясню, почему я хочу это сделать позже. Вот в чем проблема. У меня есть функция, которая возвращает обещание, как показано ниже:Функция ввода, которая возвращает обещание в состоянии redux
const testFunc =() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve('succeeded');
} else {
reject('failed');
}
}, 1000);
});
};
Как и следовало ожидать, я могу вызвать его, как это прекрасно:
testFunc()
.then((result) => console.log(result)) // 'succeeded'
.catch((error) => console.log(error)); // 'failed'
Или присвоить его переменной и назвать его, как этот
const testFuncVar = testFunc;
testFuncVar()
.then((result) => console.log(result)) // 'succeeded'
.catch((error) => console.log(error)); // 'failed'
Все это ожидается. Однако, как только я поместил функцию в состояние redux, затем вызовите ее оттуда, она больше не работает. Вот что я сделал (сильно упростил).
const initialState = {testFunc: testFunc};
// redux reducer, action creator, etc.
...
...
// somewhere later. Here I'm using redux-thunk to access redux state
function testFunInState() {
return (dispatch, getState) => {
const {testFunc} = getState();
// this is not working
testFunc()
.then((result) => console.log(result))
.catch((error) => console.log(error));
};
}
ошибка я получил _promise2 is not defined
. Обратите внимание, что имя переменной _promise2
должно быть из транспондера babel. Если I console.log(state.testFunc)
или console.log(testFunc)
, я получил:
testFunc() {
return new _promise2.default(function (resolve, reject) {
if (Math.random() > 0.5) {
resolve('succeeded');
} else {
reject('failed');
}
});
}
Так или иначе объект Promise
потерялся всякий раз, когда функция помещается в Redux состоянии?
Но я нашел обходное решение. Если изменить функцию
const testFunc = (resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve('succeeded');
} else {
reject('failed');
}
}, 1000);
};
И называть его resolve
и reject
переданными в качестве параметров, то я хорошо.
// this works
new Promise((resolve, reject) => state.testFunc(resolve, reject))
.then((result) => console.log(result))
.catch((error) => console.log(error));
Я задаюсь вопросом, почему это функция, которая возвращает обещание не работает, когда он положил в Redux магазине, но один без возвращения обещание работает?
Теперь о том, почему я хочу это сделать. То, что я пытаюсь достичь, - это иметь очередь заданий, которая периодически отправляет некоторые асинхронные действия и в зависимости от результата (разрешать или отклонять) делает что-то еще (например, повторить попытку или отправить уведомление). Я хочу динамически добавлять/удалять задания в очередь и из очереди, поэтому сложно иметь редуктор, который может обрабатывать все возможные действия. Похоже, это разумный способ приблизиться к нему. Я открыт для предложений.
Это сбивает с толку, особенно ошибка, там, кажется, не будет '_promise2' ... ничего .. в опубликованном коде? – adeneo
Я очень подозреваю, что ошибка, с которой вы столкнулись, не показана в этом фрагменте. Неважно, что возвращает функция, вы просто сохраняете ссылку на нее в магазине. – AlexG
@adeneo '_promise2' должен быть от транслятора. Я отредактировал вопрос, чтобы сделать его более понятным. – realbug