Skip to content

使一个Promise包装的对象,可以同步调用。

Notifications You must be signed in to change notification settings

HerbLuo/sync-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sync-proxy

[sync-proxy] 将异步链的写法改为同步链的写法.

[sync-proxy] 具有一流的 typescript 支持.


1. Usages

install

yarn add @o2v/sync-proxy

npm i @o2v/sync-proxy --save

File index.js:

import { syncProxy } from '@o2v/sync-proxy'
import task from './task.js'

const taskSync = syncProxy(task)

taskSync
  .task 
  .taskPromise       // taskPromise 原本是一个Promise对象
  .getTaskPromise()  // getTaskPromise 原本返回一个Promise
  .getSuccess()
  .then(console.log) // print 'success'

File task.js:

class Task {
  constructor () {
    this.task = this
    this.taskPromise = Promise.resolve(this)
    this.getTaskPromise = () => this.taskPromise
    this.success = 'success'
    this.successPromise = Promise.resolve(this.success)
    this.getSuccess = () => this.success
    this.getSuccessPromise = () => this.successPromise
  }
}

const task = new Task()
export default task

如果不使用 syncProxy, 你可能需要这样写代码:

import { syncProxy } from '@o2v/sync-proxy'
import task from './task.js'

const getSuccess = async () => {
  const task2 = await taskSync
    .task
    .taskPromise
  
  const task3 = await task2
    .getTaskPromise()
  
  const result = task3
    .getSuccess()

  console.log(result) // print 'success'
}

getSuccess()
Edit in RunKit + npm
var { syncProxy } = require('@o2v/sync-proxy')

class Task {
  constructor () {
    this.task = this
    this.taskPromise = Promise.resolve(this)
    this.getTaskPromise = () => this.taskPromise
    this.success = 'success'
    this.successPromise = Promise.resolve(this.success)
    this.getSuccess = () => this.success
    this.getSuccessPromise = () => this.successPromise
  }
}

const task = new Task()
const taskSync = syncProxy(task)

taskSync
  .getTaskPromise()
  .success
  .then(console.log) // print 'success'

taskSync
  .task
  .taskPromise
  .getTaskPromise()
  .getSuccess()
  .then(console.log) // print 'success'
  
taskSync
  .getTaskPromise()
  .getTaskPromise()
  .taskPromise
  .task
  .task
  // any sync and async properties or calls ....
  .getSuccessPromise()
  .then(console.log) // print 'success'

2. 这是目前发现的唯一的坑

1. 如果被ayncProxy封装的对象是一个代理,或者他的某个属性或方法返回一个代理,务必在代理中处理then(使该代理逃避isPromise的检测).
class Task {
  proxyReturningFunc() {
    return new Proxy({}, {
      get(_, key, receiver) {
        if (key === 'then') { // it's important
          return undefined
        }
        return (...args) => {}
      }
    })
  }
}

About

使一个Promise包装的对象,可以同步调用。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published