function getData(val) {
return new Promise(resolve => {
setTimeout(() => {
resolve(val * 2)
}, 1000);
})
}
async function get() {
const data1 = await getData(1);
const data2 = await getData(data1);
return `success: ${data2}`;
}
get().then(res => {
console.log('%c [ res ]-18', 'font-size:13px; background:pink; color:#bf2c9f;', res)
})
function* getGen() {
const data1 = yield getData(1)
const data2 = yield getData(data1);
return `success: ${data2}`;
}
var g = getGen();
var next1 = g.next();
next1.value.then(data1 => {
console.log(data1,);
data1 = 4;
var next2 = g.next(data1);
next2.value.then(data2 => {
console.log(data2, 'data2');
})
})
function geneatorToAsync(geneatorFun) {
return function() {
return new Promise((resolve, reject) => {
const g = geneatorFun();
const next1 = g.next();
next1.value.then(_data1 => {
const next2 = g.next(_data1);
next2.value.then(_data2 => {
resolve(g.next(_data2).value);
})
})
})
}
}
const asyncFun = geneatorToAsync(getGen);
asyncFun().then(res => {
console.log('res: ', res);
})
function MGeneatorToAsync(geneatorFun) {
return function() {
const gen = geneatorFun.apply(this, arguments);
return new Promise((resolve, reject) => {
let res;
function step(key, arg) {
try {
res = gen[key](arg);
} catch (error) {
return reject(error)
}
const { value, done } = res;
if(done) {
return resolve(value);
} else {
return Promise.resolve(value).then(_value => step('next', _value), _err => step('throw', _err))
}
}
step('next');
})
}
}
var asyncFun1 = MGeneatorToAsync(getGen)
asyncFun1().then(res => {
console.log('res: ', res);
})