exports.co = function (func) {
let context = this;
let restParams = Array.prototype.slice.call(arguments, 1);
let iterator = func.apply(context, restParams);
function isPromise(obj) {
return typeof obj === "object" && typeof obj.then === "function";
}
return new Promise((resolve, reject) => {
let loop = function (nextVal) {
let ret = null;
try {
ret = iterator.next(nextVal);
} catch (err) {
reject(err);
return;
}
if (ret.done) {
resolve(ret.value);
} else {
if (isPromise(ret.value)) {
ret.value.then((val) => {
loop(val);
}, (err) => {
reject(err);
})
} else {
loop(ret.value);
}
}
};
loop();
});
};
exports.makeAsync = function (text, after) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(text), after)
})
};
exports.testYield = function *() {
let value = yield 12345;
return yield this.makeAsync(value, 100);
};
this.co(function *(greeting) {
let foo = yield this.makeAsync("foo", 300);
let bar = yield this.makeAsync("bar", 200);
let baz = yield this.makeAsync("baz", 100);
let th = yield *this.testYield();
return (`${greeting} ${foo} ${bar} ${baz} ${th}`)
}, "hello").then(function (obj) {
console.log(obj);
})
.catch(function (err) {
console.log(err);
});
let context = this;
let restParams = Array.prototype.slice.call(arguments, 1);
let iterator = func.apply(context, restParams);
function isPromise(obj) {
return typeof obj === "object" && typeof obj.then === "function";
}
return new Promise((resolve, reject) => {
let loop = function (nextVal) {
let ret = null;
try {
ret = iterator.next(nextVal);
} catch (err) {
reject(err);
return;
}
if (ret.done) {
resolve(ret.value);
} else {
if (isPromise(ret.value)) {
ret.value.then((val) => {
loop(val);
}, (err) => {
reject(err);
})
} else {
loop(ret.value);
}
}
};
loop();
});
};
exports.makeAsync = function (text, after) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(text), after)
})
};
exports.testYield = function *() {
let value = yield 12345;
return yield this.makeAsync(value, 100);
};
this.co(function *(greeting) {
let foo = yield this.makeAsync("foo", 300);
let bar = yield this.makeAsync("bar", 200);
let baz = yield this.makeAsync("baz", 100);
let th = yield *this.testYield();
return (`${greeting} ${foo} ${bar} ${baz} ${th}`)
}, "hello").then(function (obj) {
console.log(obj);
})
.catch(function (err) {
console.log(err);
});