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)
```
This commit is contained in:
kevinhwang91 2023-01-05 20:50:52 +08:00
parent 25ac2ddb57
commit 3f6dcb2f0f
5 changed files with 14 additions and 16 deletions

View file

@ -101,7 +101,7 @@ Summary up the API different from JavaScript.
| JavaScript | Lua |
| --------------------------------------------------- | ----------------------------------------------- |
| `new Promise` | `Promise.new`/`Promise` |
| `new Promise` | `Promise:new`/`Promise` |
| `Promise.then` | `Promise:thenCall`, `then` is language keyword |
| `Promise.catch` | `Promise:catch` |
| `Promise.finally` | `Promise:finally` |

View file

@ -15,7 +15,7 @@ local function setTimeout(callback, ms)
end
local function defuse(ms)
return promise.new(function(resolve, reject)
return promise:new(function(resolve, reject)
setTimeout(function()
resolve(ms)
end, ms)

View file

@ -55,7 +55,7 @@ function Async.sync(executor)
local isCallable, fn = utils.getCallable(executor, typ)
assert(isCallable, 'a callable table or function expected, got ' .. typ)
injectENV(fn)
return promise.new(function(resolve, reject)
return promise:new(function(resolve, reject)
local co = coroutine.create(typ == 'function' and executor or function()
return executor()
end)

View file

@ -22,7 +22,7 @@ local REJECTED = 3
---@field err? PromiseAsyncError
local Promise = setmetatable({_id = promiseId}, {
__call = function(self, executor)
return self.new(executor)
return self:new(executor)
end
})
Promise.__index = Promise
@ -241,11 +241,9 @@ resolvePromise = function(promise, value)
end
end
function Promise.new(executor)
function Promise:new(executor)
utils.assertType(executor, 'function')
---@type Promise
local o = setmetatable({}, Promise)
local o = self == Promise and setmetatable({}, self) or self
o.state = PENDING
o.result = nil
o.queue = {}
@ -258,7 +256,7 @@ function Promise.new(executor)
end
function Promise:thenCall(onFulfilled, onRejected)
local o = Promise.new(noop)
local o = self.new(Promise, noop)
table.insert(self.queue, {o, onFulfilled, onRejected})
if self.state ~= PENDING then
handleQueue(self)
@ -292,7 +290,7 @@ function Promise.resolve(value)
if Promise.isInstance(value, typ) then
return value
else
local o = Promise.new(noop)
local o = Promise:new(noop)
local thenCall = getThenable(value, typ)
if thenCall then
wrapExecutor(o, thenCall, value)
@ -305,7 +303,7 @@ function Promise.resolve(value)
end
function Promise.reject(reason)
local o = Promise.new(noop)
local o = Promise:new(noop)
o.state = REJECTED
o.result = reason
handleRejection(o)
@ -314,7 +312,7 @@ end
function Promise.all(values)
utils.assertType(values, 'table')
return Promise.new(function(resolve, reject)
return Promise:new(function(resolve, reject)
local res = {}
local cnt = 0
for k, v in pairs(values) do
@ -337,7 +335,7 @@ end
function Promise.allSettled(values)
utils.assertType(values, 'table')
return Promise.new(function(resolve, reject)
return Promise:new(function(resolve, reject)
local res = {}
local cnt = 0
local _ = reject
@ -362,7 +360,7 @@ end
function Promise.any(values)
utils.assertType(values, 'table')
return Promise.new(function(resolve, reject)
return Promise:new(function(resolve, reject)
local cnt = 0
local function rejectAggregateError()
if cnt == 0 then
@ -386,7 +384,7 @@ end
function Promise.race(values)
utils.assertType(values, 'table')
return Promise.new(function(resolve, reject)
return Promise:new(function(resolve, reject)
for _, p in pairs(values) do
Promise.resolve(p):thenCall(function(value)
resolve(value)

View file

@ -12,7 +12,7 @@ local Promise = {}
---a resolve callback used to resolve the promise with a value or the result of another promise,
---and a reject callback used to reject the promise with a provided reason or error.
---@return Promise promise A new Promise.
function Promise.new(executor) end
function Promise:new(executor) end
---Attaches callbacks for the resolution and/or rejection of the Promise.
---@param onFulfilled? fun(value: any): any The callback to execute when the Promise is resolved.