From 35a6df15621db86f2cbdd2e9e1f32d88add4b7a1 Mon Sep 17 00:00:00 2001 From: Oleksandr Chekhovskyi Date: Wed, 7 Aug 2024 14:28:53 +0300 Subject: [PATCH] Fix Meteor.promisify and add a test for it This fixes a regression introduced in commit 87f8697941. --- packages/meteor/helpers.js | 8 +++++--- packages/meteor/helpers_test.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/meteor/helpers.js b/packages/meteor/helpers.js index ac6b801d837..3dd1e2a6b18 100644 --- a/packages/meteor/helpers.js +++ b/packages/meteor/helpers.js @@ -85,6 +85,10 @@ Meteor.promisify = function (fn, context, errorFirst) { } return function () { + var self = this; + var filteredArgs = Array.prototype.slice.call(arguments) + .filter(function (i) { return i !== undefined; }); + return new Promise(function (resolve, reject) { var callback = Meteor.bindEnvironment(function (error, result) { var _error = error, _result = result; @@ -100,11 +104,9 @@ Meteor.promisify = function (fn, context, errorFirst) { resolve(_result); }); - var filteredArgs = Array.prototype.slice.call(arguments) - .filter(function (i) { return i !== undefined; }); filteredArgs.push(callback); - return fn.apply(context || this, filteredArgs); + return fn.apply(context || self, filteredArgs); }); }; }; diff --git a/packages/meteor/helpers_test.js b/packages/meteor/helpers_test.js index 78c968fffb8..faff0a6554a 100644 --- a/packages/meteor/helpers_test.js +++ b/packages/meteor/helpers_test.js @@ -100,3 +100,24 @@ Tinytest.add("environment - startup", function (test) { }); test.isTrue(called); }); + +Tinytest.addAsync("environment - promisify", async function (test) { + function TestClass(value) { + this.value = value; + } + + TestClass.prototype.method = function (arg1, arg2, callback) { + var value = this.value; + setTimeout(function () { + callback(null, arg1 + arg2 + value); + }, 0); + }; + + TestClass.prototype.methodAsync = Meteor.promisify(TestClass.prototype.method); + + var instance = new TestClass(5); + test.equal(await instance.methodAsync(1, 2), 8); + + let asyncMethodWithContext = Meteor.promisify(instance.method, instance); + test.equal(await asyncMethodWithContext(2, 3), 10); +});