Skip to content

Commit 3f6dcb2

Browse files
committed
fix!: use promise:new instead of promise.new
In Lua convention, create an object always carry `self`, so we must break change for further development. Create an promise object: ```lua local p = promise:new(function(resolve, reject) end) -- or local p = promise(function(resolve, reject) end) ```
1 parent 25ac2dd commit 3f6dcb2

File tree

5 files changed

+14
-16
lines changed

5 files changed

+14
-16
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Summary up the API different from JavaScript.
101101

102102
| JavaScript | Lua |
103103
| --------------------------------------------------- | ----------------------------------------------- |
104-
| `new Promise` | `Promise.new`/`Promise` |
104+
| `new Promise` | `Promise:new`/`Promise` |
105105
| `Promise.then` | `Promise:thenCall`, `then` is language keyword |
106106
| `Promise.catch` | `Promise:catch` |
107107
| `Promise.finally` | `Promise:finally` |

examples/demo.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ local function setTimeout(callback, ms)
1515
end
1616

1717
local function defuse(ms)
18-
return promise.new(function(resolve, reject)
18+
return promise:new(function(resolve, reject)
1919
setTimeout(function()
2020
resolve(ms)
2121
end, ms)

lua/async.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ function Async.sync(executor)
5555
local isCallable, fn = utils.getCallable(executor, typ)
5656
assert(isCallable, 'a callable table or function expected, got ' .. typ)
5757
injectENV(fn)
58-
return promise.new(function(resolve, reject)
58+
return promise:new(function(resolve, reject)
5959
local co = coroutine.create(typ == 'function' and executor or function()
6060
return executor()
6161
end)

lua/promise.lua

+10-12
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ local REJECTED = 3
2222
---@field err? PromiseAsyncError
2323
local Promise = setmetatable({_id = promiseId}, {
2424
__call = function(self, executor)
25-
return self.new(executor)
25+
return self:new(executor)
2626
end
2727
})
2828
Promise.__index = Promise
@@ -241,11 +241,9 @@ resolvePromise = function(promise, value)
241241
end
242242
end
243243

244-
function Promise.new(executor)
244+
function Promise:new(executor)
245245
utils.assertType(executor, 'function')
246-
---@type Promise
247-
local o = setmetatable({}, Promise)
248-
246+
local o = self == Promise and setmetatable({}, self) or self
249247
o.state = PENDING
250248
o.result = nil
251249
o.queue = {}
@@ -258,7 +256,7 @@ function Promise.new(executor)
258256
end
259257

260258
function Promise:thenCall(onFulfilled, onRejected)
261-
local o = Promise.new(noop)
259+
local o = self.new(Promise, noop)
262260
table.insert(self.queue, {o, onFulfilled, onRejected})
263261
if self.state ~= PENDING then
264262
handleQueue(self)
@@ -292,7 +290,7 @@ function Promise.resolve(value)
292290
if Promise.isInstance(value, typ) then
293291
return value
294292
else
295-
local o = Promise.new(noop)
293+
local o = Promise:new(noop)
296294
local thenCall = getThenable(value, typ)
297295
if thenCall then
298296
wrapExecutor(o, thenCall, value)
@@ -305,7 +303,7 @@ function Promise.resolve(value)
305303
end
306304

307305
function Promise.reject(reason)
308-
local o = Promise.new(noop)
306+
local o = Promise:new(noop)
309307
o.state = REJECTED
310308
o.result = reason
311309
handleRejection(o)
@@ -314,7 +312,7 @@ end
314312

315313
function Promise.all(values)
316314
utils.assertType(values, 'table')
317-
return Promise.new(function(resolve, reject)
315+
return Promise:new(function(resolve, reject)
318316
local res = {}
319317
local cnt = 0
320318
for k, v in pairs(values) do
@@ -337,7 +335,7 @@ end
337335

338336
function Promise.allSettled(values)
339337
utils.assertType(values, 'table')
340-
return Promise.new(function(resolve, reject)
338+
return Promise:new(function(resolve, reject)
341339
local res = {}
342340
local cnt = 0
343341
local _ = reject
@@ -362,7 +360,7 @@ end
362360

363361
function Promise.any(values)
364362
utils.assertType(values, 'table')
365-
return Promise.new(function(resolve, reject)
363+
return Promise:new(function(resolve, reject)
366364
local cnt = 0
367365
local function rejectAggregateError()
368366
if cnt == 0 then
@@ -386,7 +384,7 @@ end
386384

387385
function Promise.race(values)
388386
utils.assertType(values, 'table')
389-
return Promise.new(function(resolve, reject)
387+
return Promise:new(function(resolve, reject)
390388
for _, p in pairs(values) do
391389
Promise.resolve(p):thenCall(function(value)
392390
resolve(value)

typings/promise.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ local Promise = {}
1212
---a resolve callback used to resolve the promise with a value or the result of another promise,
1313
---and a reject callback used to reject the promise with a provided reason or error.
1414
---@return Promise promise A new Promise.
15-
function Promise.new(executor) end
15+
function Promise:new(executor) end
1616

1717
---Attaches callbacks for the resolution and/or rejection of the Promise.
1818
---@param onFulfilled? fun(value: any): any The callback to execute when the Promise is resolved.

0 commit comments

Comments
 (0)