ask-for-promise
Version:
promise utility library
2 lines (1 loc) • 1.54 kB
JavaScript
;function e(e){return e?function(e){let i=e.map((e=>n())),r=i.map((e=>e.promise));i.promises=i;let c=t(Promise.all(r));function u(e){let n="pending";return e.then((()=>n="fulfilled")).catch((()=>n="rejected")),n}function l(n,...t){i.forEach(((o,i)=>n({value:e[i],done:o.done,cancel:o.cancel,timeout:o.timeout,state:u(o.promise)},...t)))}const m={promise:Promise.all(r),promises:i,done:e=>{i.forEach((n=>n.done(e)))},cancel:e=>{i.forEach((n=>n.cancel(e)))},each:l,onComplete:c,timeout:()=>{}};return m.timeout=o(!0,m),m}(e):n()}function n(){let e,n;const i=new Promise(((t,o)=>{e=t,n=o})),r={promise:i,promises:null,done:e,cancel:n,each:()=>{},onComplete:t(i),timeout:()=>{}};return r.timeout=o(!1,r),r.each=(t,...o)=>{t({value:null,done:e,cancel:n,timeout:r.timeout},...o)},r}function t(e){return function(n,t=null){null===t?e.then((e=>n(e))):e.then((e=>n(e)),(e=>t(e)))}}function o(e,n){let o;return o=e?Promise.all(n.promises.map((e=>e.promise))):n.promise,function(e,i){let r,c=new Promise(((n,t)=>{r=setTimeout((()=>{n(i),Promise.resolve(o)}),e)}));return o.then((()=>clearTimeout(r))),n.onComplete=t(Promise.race([o,c])),n}}e.sequence=function(n,...t){const o=e(),i=[];const r=function*(e){for(const n of e)yield n}(n);return function e(n,...t){n.done?o.done(i):n.value(...t).then((n=>{i.push(n),e(r.next(),...t,n)}))}(r.next(),...t),o},e.all=function(n,...t){const o=e(),i=[],r=n.map(((e,n)=>"function"==typeof e?e(...t).then((e=>i[n]=e)):e.then((e=>i[n]=e))));return Promise.all(r).then((()=>o.done(i))),o},module.exports=e;