From a4b4b73ce7751a5ef7ec036dd67eda4d89a1a5a8 Mon Sep 17 00:00:00 2001 From: ele828 Date: Fri, 13 Jul 2018 16:10:58 +0800 Subject: [PATCH 1/4] add serialize decorator to make serialized operation --- .../ringcentral-integration/lib/serialize.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 packages/ringcentral-integration/lib/serialize.js diff --git a/packages/ringcentral-integration/lib/serialize.js b/packages/ringcentral-integration/lib/serialize.js new file mode 100644 index 0000000000..dab04910f6 --- /dev/null +++ b/packages/ringcentral-integration/lib/serialize.js @@ -0,0 +1,20 @@ +export default function serialize(target, key, descriptor) { + let prev = null; + function serializeFunc(...args) { + const next = () => descriptor.value.apply(this, args); + if (prev) { + prev = prev.then(() => { + prev = null; + next(); + }); + } else { + prev = next(); + } + return prev; + } + + return { + ...descriptor, + value: serializeFunc, + }; +} From 41595eb0b6abdc17cb3f7089601df2896efea49a Mon Sep 17 00:00:00 2001 From: ele828 Date: Fri, 13 Jul 2018 16:22:15 +0800 Subject: [PATCH 2/4] add comments and example --- packages/ringcentral-integration/lib/serialize.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/ringcentral-integration/lib/serialize.js b/packages/ringcentral-integration/lib/serialize.js index dab04910f6..85264680f1 100644 --- a/packages/ringcentral-integration/lib/serialize.js +++ b/packages/ringcentral-integration/lib/serialize.js @@ -1,3 +1,13 @@ +/** + * A decorator for making sure specific function being invoked serializely. + * + * Usage: + * class A { + * @serialize + * async foo() {} + * } + * + */ export default function serialize(target, key, descriptor) { let prev = null; function serializeFunc(...args) { From de95a2f5e1e63a083f81046c90b60784d19d0673 Mon Sep 17 00:00:00 2001 From: ele828 Date: Fri, 13 Jul 2018 17:10:56 +0800 Subject: [PATCH 3/4] bugfix --- packages/ringcentral-integration/lib/serialize.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ringcentral-integration/lib/serialize.js b/packages/ringcentral-integration/lib/serialize.js index 85264680f1..5a7eb0a6fa 100644 --- a/packages/ringcentral-integration/lib/serialize.js +++ b/packages/ringcentral-integration/lib/serialize.js @@ -11,12 +11,12 @@ export default function serialize(target, key, descriptor) { let prev = null; function serializeFunc(...args) { - const next = () => descriptor.value.apply(this, args); - if (prev) { - prev = prev.then(() => { + const next = () => descriptor.value.apply(this, args) + .then(() => { prev = null; - next(); }); + if (prev) { + prev = prev.then(next); } else { prev = next(); } From a23fd4cf14b25d63a68c9e50b802120adb1cdc83 Mon Sep 17 00:00:00 2001 From: ele828 Date: Fri, 13 Jul 2018 17:23:22 +0800 Subject: [PATCH 4/4] make it compatible with normal functions --- packages/ringcentral-integration/lib/serialize.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/ringcentral-integration/lib/serialize.js b/packages/ringcentral-integration/lib/serialize.js index 5a7eb0a6fa..775cd39bfb 100644 --- a/packages/ringcentral-integration/lib/serialize.js +++ b/packages/ringcentral-integration/lib/serialize.js @@ -11,15 +11,12 @@ export default function serialize(target, key, descriptor) { let prev = null; function serializeFunc(...args) { - const next = () => descriptor.value.apply(this, args) - .then(() => { - prev = null; - }); - if (prev) { - prev = prev.then(next); - } else { - prev = next(); - } + const next = () => Promise.resolve( + descriptor.value.apply(this, args) + ).then(() => { + prev = null; + }); + prev = prev ? prev.then(next) : next(); return prev; }