From 553b300b1015521c222350ec58a0ec083299993c Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 20 Dec 2017 20:46:40 +0600 Subject: [PATCH 1/8] add promise support --- index.js | 16 +++++++++++++++- package-lock.json | 7 ++++--- test.js | 14 ++++++++++++++ yarn.lock | 11 +++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 yarn.lock diff --git a/index.js b/index.js index 28acb68..643bf23 100644 --- a/index.js +++ b/index.js @@ -41,7 +41,7 @@ var res; fn.apply(this, args); - module.exports.loopWhile(function(){return !done;}); + module.exports.loopWhile(function(){ return !done; }); if (err) throw err; @@ -73,4 +73,18 @@ } }; + module.exports.wait = function(pr) { + var done, result; + + done = false; + result = undefined; + + pr.then(function(r) { + done = true; + result = r; + }); + deasync.loopWhile(() => { return !done }); + return result; + }; + }()); diff --git a/package-lock.json b/package-lock.json index 716fb66..f2e9de7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "deasync", - "version": "0.1.10", + "version": "0.1.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10,8 +10,9 @@ "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" }, "nan": { - "version": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" } } } diff --git a/test.js b/test.js index fa4ca1c..91e3466 100644 --- a/test.js +++ b/test.js @@ -29,3 +29,17 @@ setTimeout(function () { console.log(exec('ls -la')); sleep(2000); console.log(request('http://nodejs.org')); + +function sleepAsync(time) { + return new Promise(function(resolve, reject) { + setTimeout(function() { + resolve() + }, time) + }) +} +async function trim(str) { + await sleepAsync(2000) + return str.trim() +} + +console.log(deasync.wait(trim(' hello '))) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b6d2052 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,11 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +bindings@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" + +nan@^2.0.7: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" From 55c7d461ec5f26e906f2c0ef2d93d60145a59d3b Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 20 Dec 2017 20:46:48 +0600 Subject: [PATCH 2/8] add promise support --- yarn.lock | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index b6d2052..0000000 --- a/yarn.lock +++ /dev/null @@ -1,11 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -bindings@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" - -nan@^2.0.7: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" From 9a7ea2fc4623c0a8eaba06cdb0b2372a9c6285d4 Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 20 Dec 2017 20:47:49 +0600 Subject: [PATCH 3/8] add promise support --- index.js | 2 +- test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 643bf23..594175f 100644 --- a/index.js +++ b/index.js @@ -73,7 +73,7 @@ } }; - module.exports.wait = function(pr) { + module.exports.await = function(pr) { var done, result; done = false; diff --git a/test.js b/test.js index 91e3466..484e7e8 100644 --- a/test.js +++ b/test.js @@ -42,4 +42,4 @@ async function trim(str) { return str.trim() } -console.log(deasync.wait(trim(' hello '))) +console.log(deasync.await(trim(' hello '))) From 0c115d5197998a00fdbc143c8eda7e8459cad84f Mon Sep 17 00:00:00 2001 From: bluelovers Date: Fri, 13 Apr 2018 07:52:20 +0800 Subject: [PATCH 4/8] export default & index.d.ts --- index.d.ts | 25 +++++++++++++++++++++++++ index.js | 21 +++++++++++---------- package.json | 2 ++ 3 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7586b --- /dev/null +++ b/index.d.ts @@ -0,0 +1,25 @@ +/** + * Created by user on 2018/4/13/013. + */ + +declare namespace DeAsync +{ + export interface IApi + { + (fn: (argv, done: (err: U, value: T) => never) => T, ...argv): T, + (fn: (done: (err: U, value: T) => never) => T, ...argv): T, + (fn: (...argv) => T, ...argv): T, + + sleep(fn: (timeout: number, done: () => never) => void), + runLoopOnce(): never, + loopWhile(pred: (...argv) => boolean): never, + await(pr: Promise): T + + default: IApi, + } +} + +declare const DeAsync: DeAsync.IApi; +export = DeAsync; + +export as namespace DeAsync; diff --git a/index.js b/index.js index 594175f..a926b2b 100644 --- a/index.js +++ b/index.js @@ -5,17 +5,17 @@ * Copyright 2014-2015 Abbr * Released under the MIT license */ - + (function () { - + var fs = require('fs'), path = require('path'), binding; - + // Seed random numbers [gh-82] if on Windows. See https://github.com/laverdet/node-fibers/issues/82 if(process.platform === 'win32') Math.random(); - - + + // Look for binary for this platform var nodeV = 'node-' + /[0-9]+\.[0-9]+/.exec(process.versions.node)[0]; var nodeVM = 'node-' + /[0-9]+/.exec(process.versions.node)[0]; @@ -50,22 +50,23 @@ function cb(e, r) { err = e; res = r; - done = true; + done = true; } } } - + module.exports = deasync; - + module.exports.default = deasync; + module.exports.sleep = deasync(function(timeout, done) { setTimeout(done, timeout); }); - + module.exports.runLoopOnce = function(){ process._tickCallback(); binding.run(); }; - + module.exports.loopWhile = function(pred){ while(pred()){ process._tickCallback(); diff --git a/package.json b/package.json index c84ee42..2500d4e 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,8 @@ "async", "sync", "sleep", + "await", + "promise", "async wrapper" ], "engines": { From b3968d9c31088f79d072b8505c6e54a146a86404 Mon Sep 17 00:00:00 2001 From: bluelovers Date: Fri, 13 Apr 2018 08:08:09 +0800 Subject: [PATCH 5/8] export default & index.d.ts --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 0c7586b..3da0c00 100644 --- a/index.d.ts +++ b/index.d.ts @@ -10,7 +10,7 @@ declare namespace DeAsync (fn: (done: (err: U, value: T) => never) => T, ...argv): T, (fn: (...argv) => T, ...argv): T, - sleep(fn: (timeout: number, done: () => never) => void), + sleep(timeout: number): never, runLoopOnce(): never, loopWhile(pred: (...argv) => boolean): never, await(pr: Promise): T From 6d173077749a4c0577056b5194e876b64df872d8 Mon Sep 17 00:00:00 2001 From: bluelovers Date: Fri, 13 Apr 2018 08:21:51 +0800 Subject: [PATCH 6/8] demo --- test/await.demo.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/await.demo.js diff --git a/test/await.demo.js b/test/await.demo.js new file mode 100644 index 0000000..9d68b34 --- /dev/null +++ b/test/await.demo.js @@ -0,0 +1,32 @@ +/** + * Created by user on 2018/4/13/013. + */ + +const deasync = require(".."); +const timstamp = Date.now(); + +function f(n) +{ + return new Promise(function (done) + { + setTimeout(done, n); + }) + .then(function () + { + logWithTime(n); + }); +} + +console.time(); +f(500); +let p = f(1500); +deasync.sleep(1000); +//msleep(1000); +logWithTime(1000); +deasync.await(p); +console.timeEnd(); + +function logWithTime(...argv) +{ + console.log(`[${Date.now() - timstamp}]`, ...argv); +} From c87c3e362becec1581dafe26c9ae0fa5a1a83042 Mon Sep 17 00:00:00 2001 From: bluelovers Date: Fri, 13 Apr 2018 09:24:05 +0800 Subject: [PATCH 7/8] return value at source Promise --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index a926b2b..6990eb0 100644 --- a/index.js +++ b/index.js @@ -82,7 +82,7 @@ pr.then(function(r) { done = true; - result = r; + return result = r; }); deasync.loopWhile(() => { return !done }); return result; From 643be23fb12a62b166dec8a3cf4f3208661023e7 Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 17 May 2019 20:13:02 +0600 Subject: [PATCH 8/8] Add error handler in Promise --- index.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 6990eb0..a2f8946 100644 --- a/index.js +++ b/index.js @@ -80,10 +80,16 @@ done = false; result = undefined; - pr.then(function(r) { - done = true; - return result = r; - }); + pr + .then(function(r) { + done = true; + return result = r; + }) + .catch(function(err) { + done = true + throw err + }) + deasync.loopWhile(() => { return !done }); return result; };