more cleanup and not sync promise looks complete...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2022-12-04 15:58:28 +03:00
parent ccdc832685
commit a95eb234c4
3 changed files with 54 additions and 8 deletions

View File

@ -795,6 +795,34 @@ object.Constructor('ProxyPromise', Promise, {
//---------------------------------------------------------------------
var syncAllProxy =
function(name){
return function(lst){
var sync = true
for(var e of lst){
if(e instanceof Promise
&& !(e instanceof SyncPromise)){
sync = false
break } }
return sync ?
this.resolve(lst)
: Promise[name](lst) } }
// XXX REVISE/TEST...
var syncAnyPromise =
function(name){
return function(lst){
for(var e of lst){
if(e instanceof SyncPromise
&& !('error' in e)){
return e }
if(!(e instanceof Promise)){
return this.resolve(e) } }
return Promise[name](list) } }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// XXX EXPEREMENTAL...
// XXX DOCS...
// XXX like promise but if a value can be generated sync then this will
@ -803,6 +831,17 @@ object.Constructor('ProxyPromise', Promise, {
var SyncPromise =
module.SyncPromise =
object.Constructor('SyncPromise', Promise, {
// NOTE: we need to overload these as the builtin versions sneak-in
// async-ness before we can catch it in .__new__(..)
resolve: function(value){
return new this(function(resolve){ resolve(value) }) },
reject: function(error){
return new this(function(_, reject){ reject(error) }) },
all: syncAllProxy('all'),
allSettled: syncAllProxy('allSettled'),
any: syncAnyProxy('any'),
race: syncAnyProxy('race'),
},{
//value: undefined,
//error: undefined,
@ -821,14 +860,14 @@ object.Constructor('SyncPromise', Promise, {
// NOTE: if func calls resolve(..) with a promise then this will return
// that promise...
__new__: function(context, func){
var result
var value
var resolve = function(res){
result = res }
return (value = res) }
var rejected
var error
var reject = function(err){
rejected = true
error = err }
return (error = err) }
// call...
try{
func(resolve, reject)
@ -836,12 +875,12 @@ object.Constructor('SyncPromise', Promise, {
reject(err) }
// async...
if(!error
&& result instanceof Promise){
return result }
&& value instanceof Promise){
return value }
// sync...
var obj = Promise.resolve(result)
var obj = Promise.resolve(value)
obj.__proto__ = this.prototype
obj.value = result
obj.value = value
rejected
&& (obj.error = error)
return obj },

View File

@ -98,6 +98,7 @@ Library of JavaScript type extensions, types and utilities.
- [`Promise.sync(..)` / `promise.SyncPromice(..)`](#promisesync--promisesyncpromice)
- [`<promise>.sync(..)`](#promisesync)
- [`<sync-promise>.value` / `<sync-promise>.error`](#sync-promisevalue--sync-promiseerror)
- [`Promise.sync.all(..)` / `Promise.sync.allSettled(..)` / `Promise.sync.any(..)` / `Promise.sync.race(..)`](promisesyncall--promisesyncallsettled--promisesyncany--promisesyncrace`)
- [Promise utilities](#promise-utilities)
- [`Promise.awaitOrRun(..)`](#promiseawaitorrun)
- [Generator extensions and utilities](#generator-extensions-and-utilities)
@ -2045,6 +2046,12 @@ if it _rejected_ then re-throw the `<error>`.
rejection `.error`.
#### `Promise.sync.all(..)` / `Promise.sync.allSettled(..)` / `Promise.sync.any(..)` / `Promise.sync.race(..)`
Equivalents to `Promise`'s version but will run sync if the relevant
items in the input are either non-promises or `<sync-promise>`s.
### Promise utilities

View File

@ -1,6 +1,6 @@
{
"name": "ig-types",
"version": "6.24.1",
"version": "6.24.2",
"description": "Generic JavaScript types and type extensions...",
"main": "main.js",
"scripts": {