Skip to content

Instantly share code, notes, and snippets.

@hasangilak
Last active January 1, 2017 17:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hasangilak/7742df6dbf0f00f3d063623e9e643b09 to your computer and use it in GitHub Desktop.
Save hasangilak/7742df6dbf0f00f3d063623e9e643b09 to your computer and use it in GitHub Desktop.
function resolvePromise(promise, iterator) {
promise.then(
(response) => {
let result = iterator.next(response);
if (!result.done) {
sync(result.value, iterator);
}
},
error => {
let result = iterator.next(error);
if (!result.done) {
sync(result.value, iterator);
}
}
);
}
function resolveGenerator(generator, iterator) {
let result = generator.next();
if (!result.done) {
sync(result.value, iterator);
}
}
function resolveSimpleResult(result, iterator) {
let _result = iterator.next(result);
if (!_result.done) {
sync(_result.value, iterator)
}
}
function callGenerator(generator) {
if (typeof generator == "function") {
return generator();
}
return generator;
}
function decideOnGeneratorOrPromiseOrSimpleAnswer(result) {
if (result.next) {
return {type: "generator", result};
} else if (result.then) {
return {type: "promise", result};
}
return {type: "result", result};
}
function chooseGenerator(generator, iterator) {
if (generator.next) {
return generator;
}
return iterator;
}
export function sync(generator, iterator) {
let {type, result} = decideOnGeneratorOrPromiseOrSimpleAnswer(callGenerator(generator));
if (type == "generator") {
resolveGenerator(result, chooseGenerator(result, iterator));
} else if (type == "promise") {
resolvePromise(result, chooseGenerator(result, iterator));
} else if (type == "result") {
console.log(result);
resolveSimpleResult(result, chooseGenerator(result, iterator));
}
}
/////////////////////////////////////////
// utitlities and foo bar example
///////////////////////////////////////
// throwError
export function throwError(middleWareName, recover, _message = "") {
let error = new Error('cant pass ' + middleWareName);
error.recover = function () {
recover();
};
error.message = function () {
return _message;
};
throw error;
}
//isLoginMiddleWare
export function* isLoginMiddleware(nextState, replace, next) {
let {user, response} = yield ping();
if (response.statusCode == 200) {
throwError('isLoginMiddleware', function () {
console.log('recovered')
}, 'custom message');
replace('/profile');
} else {
browserHistory.push('/login');
AlertBox("error", "لطفا در ابتدا وارد حساب کاربری شوید")
}
}
// example
sync(function*() {
try {
yield* isLoginMiddleware(nextState, replace);
next()
} catch (error) {
error.recover();
console.log(error.message())
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment