diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..3da0c00 --- /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(timeout: number): never, + 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 28acb68..a2f8946 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]; @@ -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; @@ -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(); @@ -73,4 +74,24 @@ } }; + module.exports.await = function(pr) { + var done, result; + + done = false; + result = undefined; + + pr + .then(function(r) { + done = true; + return result = r; + }) + .catch(function(err) { + done = true + throw err + }) + + 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/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": { diff --git a/test.js b/test.js index fa4ca1c..484e7e8 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.await(trim(' hello '))) 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); +}