实现async/await

首页 · 2023-12-17 · 123 人浏览
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);
})
Theme Jasmine by Kent Liao