0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Extended sequence utility

no issue

- support promise and none promise tasks
- helpful if you create an array of operations and not all of the operations/tasks are async
- `response instanceof Promise` does not work for all cases e.g. some usages return a transaction/bookshelf chain
This commit is contained in:
kirrg001 2018-10-03 00:06:16 +02:00
parent c96c474501
commit 27996db5e9
2 changed files with 44 additions and 6 deletions

View file

@ -1,16 +1,25 @@
var Promise = require('bluebird');
const Promise = require('bluebird');
/**
* expects an array of functions returning a promise
*/
function sequence(tasks /* Any Arguments */) {
var args = Array.prototype.slice.call(arguments, 1);
const args = Array.prototype.slice.call(arguments, 1);
return Promise.reduce(tasks, function (results, task) {
return task.apply(this, args).then(function (result) {
results.push(result);
return results;
});
const response = task.apply(this, args);
if (response && response.then) {
return response.then(function (result) {
results.push(result);
return results;
});
} else {
return Promise.resolve().then(() => {
results.push(response);
return results;
});
}
}, []);
}

View file

@ -0,0 +1,29 @@
const should = require('should');
const sinon = require('sinon');
const Promise = require('bluebird');
const sequence = require('../../../../server/lib/promise/sequence');
const sandbox = sinon.sandbox.create();
describe('Unit: lib/promise/sequence', function () {
afterEach(function () {
sandbox.restore();
});
it('mixed tasks: promise and none promise', function () {
const tasks = [
function a() {
return Promise.resolve('hello');
},
function b() {
return 'from';
},
function c() {
return Promise.resolve('chio');
},
];
return sequence(tasks)
.then(function (result) {
result.should.eql(['hello','from', 'chio']);
});
});
});