Async Await and Promises - как улучшить синтаксис - PullRequest
0 голосов
/ 02 февраля 2019

Как можно создать синтаксический сахар, чтобы скрыть некоторые сложности, которые являются .then?

Учитывая код ниже:

const Fridge = {
  async openDoor() {
    const myCake = new Promise(resolve => {setTimeout(()=> {
      console.log('door opened')
      resolve (Object.create(Cake))
    }, 2000)});
    await myCake
    return myCake
  }
}

const Cake= {
  eatCake(){ console.log ( 'yummy now I can eat my cake' ) }
}

const myFridge = Object.create(Fridge)

Обычно доступен через многословный:

myFridge.openDoor().then(myCake=>{
  myCake.eatCake()
  ... other code here .....
}) // complicated

Может ли быть создан некоторый сахар вместо:

myFridge.openDoor().eatCake()  //simple to understand .then implied

или далее вместо:

myObject.myPromise.then(res=>{
   let x = res
   ... do stuff with x
});

вместо

let x = myObject.myPromise.res
... so stuff with x

Все, что возвращаетсяиз асинхронной функции следует использовать для последующего вызова.И весь последующий код предполагается в .then.Закрытие .then определяется концом включающей функции (аналогично тому, как в настоящее время работает ожидание).

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Вы можете использовать await предшествующий myFridge.openDoor() вызов, заключенный в круглые скобки, чтобы сформировать выражение, затем цепочку .eatCake(), чтобы вызвать метод объекта, возвращенного из .openDoor()

(async() => {
  (await myFridge.openDoor()).eatCake()
})()
0 голосов
/ 05 февраля 2019

Вот решение, которое предоставляет синтаксический сахар, который можно использовать для скрытия сложностей await и .then:

const promiseNodeH = {
  get(target, prop) {
    if (prop in target || typeof prop !== 'string') return target[prop]
    return function() {
      const x = arguments
      const p3 = new Promise(resolve => {
        target.then(value => {
          resolve(value[prop](...x))
        })
      })
      return new Proxy(p3, Object.create(promiseNodeH))
    }
  }
}

const Cake = {
  eatCake(msg) {
    console.log(`starting to eat cake: ${msg}!`)
    const self = this
    return new Promise(resolve => {
      setTimeout(function() {
        console.log('cake eaten')
        resolve(self)
      }, 5000)
    })
  },
  getFat() {
    console.log('burp')
  }
}

const Fridge = {
  openDoor() {
    console.log('start to open door')
    const p1 = new Promise(resolve => {
      setTimeout(function() {
        console.log('door is open, here is your cake')
        resolve(Object.create(Cake))
      }, 5000)
    })
    return new Proxy(p1, Object.create(promiseNodeH))
  }
}

Доступ к ним можно получить через:

Fridge.openDoor().eatCake('Yummy').getFat()
0 голосов
/ 02 февраля 2019

есть синтаксис с именем try()catch() в сочетании с async await

, например:

async function someAsyncFunction () {
   try {
      const asyncValue = await asyncCall() //Promise
      console.log(asyncValue) // this will log only when asyncCall resolved
    }catch(error) {
     throw error
   }
  }

вместо использования Promise и цепочка then() с обратным вызовом дляэто.

вы делаете await asyncCall(), и при этом вы можете продолжать писать больше кода с разрешенным значением вместо цепочки большего количества функций с обратными вызовами

Трудно объяснить и понять на 1 фут, поэтому здесьнекоторый ресурс для асинхронного ожидания

...