mirror of
https://github.com/ZiuChen/ClipboardManager.git
synced 2025-06-07 13:54:05 +08:00
69 lines
1.3 KiB
JavaScript
69 lines
1.3 KiB
JavaScript
// author: inu1255
|
|
|
|
const path = require('path')
|
|
|
|
function newPromise(fn) {
|
|
let a, b
|
|
var tmp = {
|
|
resolve(x) {
|
|
if (this.pending) {
|
|
a(x)
|
|
this.resolved = true
|
|
this.pending = false
|
|
}
|
|
},
|
|
reject(e) {
|
|
if (this.pending) {
|
|
b(e)
|
|
this.rejectd = true
|
|
this.pending = false
|
|
}
|
|
},
|
|
pending: true,
|
|
resolved: false,
|
|
rejected: false
|
|
}
|
|
/** @type {Promise<T>} */
|
|
var pms = new Promise(function (resolve, reject) {
|
|
a = resolve
|
|
b = reject
|
|
if (fn) fn(tmp.resolve, tmp.reject)
|
|
})
|
|
return Object.assign(pms, tmp)
|
|
}
|
|
|
|
let cbIdx = 1
|
|
const cbMap = new Map()
|
|
function getWorker() {
|
|
if (getWorker.worker) return getWorker.worker
|
|
const worker = new Worker(path.join(__dirname, 'time.worker.js'))
|
|
getWorker.worker = worker
|
|
worker.onmessage = (e) => {
|
|
if (e.data && cbMap.has(e.data.cb)) {
|
|
cbMap.get(e.data.cb).apply(null, e.data.args)
|
|
}
|
|
}
|
|
return worker
|
|
}
|
|
|
|
function call(method, args) {
|
|
const cb = cbIdx++
|
|
let pms = newPromise()
|
|
cbMap.set(cb, function (err, data) {
|
|
if (err) pms.reject(err)
|
|
else pms.resolve(data)
|
|
})
|
|
getWorker().postMessage({
|
|
method,
|
|
args,
|
|
cb
|
|
})
|
|
return pms
|
|
}
|
|
|
|
function sleep(ms) {
|
|
return call('sleep', [ms])
|
|
}
|
|
|
|
exports.sleep = sleep
|