Skip to content

Instantly share code, notes, and snippets.

@Akiyamka
Last active July 16, 2018 13:00
Show Gist options
  • Select an option

  • Save Akiyamka/c49e8e7c33d5af830ce8ebe44a762e26 to your computer and use it in GitHub Desktop.

Select an option

Save Akiyamka/c49e8e7c33d5af830ce8ebe44a762e26 to your computer and use it in GitHub Desktop.
// Realization
function startPipeline(pipelineRequests, order) {
order = order || [
'before',
'requestModel',
'after',
'stateToModel',
'setValidations'
];
return order.reduce((acc, task) => acc.then(
previosResponse => {
if (typeof pipelineRequests[task] === 'function') {
return pipelineRequests[task](previosResponse)
}
return previosResponse;
}
), Promise.resolve(null));
}
// MOCK
function apiRequest(val) {
return new Promise((res, rej) => {
setTimeout(() => res(val), Math.random()*1000)
})
}
// EXAMPLE USAGE
const result = startPipeline({
before: () => {
return apiRequest(1)
},
requestModel: (previosResponse) => {
console.log(previosResponse); return apiRequest(previosResponse + 1)
},
after: (previosResponse) => {
console.log(previosResponse);
return apiRequest(previosResponse + 1)
},
stateToModel: (previosResponse) => {
console.log(previosResponse);
return apiRequest(previosResponse + 1)
},
});
result.then(res => console.log('result_0:', res))
// Optional custom order
const result2 = startPipeline({
one: () => {
return apiRequest(1)
},
two: (previosResponse) => {
console.log(previosResponse);
return apiRequest(previosResponse + 1)
},
three: (previosResponse) => {
console.log(previosResponse);
return apiRequest(previosResponse + 1)
},
}, ['three', 'two', 'one']);
result2.then(res => console.log('result_1:', res))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment