Skip to content

Commit 6512690

Browse files
committed
added result property to AsyncTask #1
1 parent 535cbff commit 6512690

File tree

6 files changed

+27
-17
lines changed

6 files changed

+27
-17
lines changed

packages/mst-async-task/.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
'no-trailing-spaces': 0,
5151
'quotes': [0, 'single', 'avoid-escape'],
5252

53+
'@typescript-eslint/explicit-module-boundary-types': 0,
5354
'@typescript-eslint/no-explicit-any': 0,
5455
'@typescript-eslint/no-unused-vars': [1, { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }]
5556
}

packages/mst-async-task/__tests__/runTask.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ describe('runTask()', () => {
5050
throw new Error('failed')
5151
}
5252
exec(() => self.value = 'ok')
53+
return 'result'
5354
}),
5455
runNoSignal: () => runTask(self.task, function*({ exec }) {
5556
yield sleep()
@@ -76,7 +77,9 @@ describe('runTask()', () => {
7677
expect(result).toBeInstanceOf(AsyncTaskResult)
7778
expect(result.status).toBe(AsyncTaskStatus.COMPLETE)
7879
expect(result.error).toBeUndefined()
80+
expect(result.value).toBe('result')
7981
expect(store.task.status).toBe(AsyncTaskStatus.COMPLETE)
82+
expect(store.task.result).toBe('result')
8083
expect(store.value).toBe('ok')
8184
})
8285

@@ -96,6 +99,7 @@ describe('runTask()', () => {
9699
await promise
97100
store.task.reset()
98101
expect(store.task.status).toBe(AsyncTaskStatus.INIT)
102+
expect(store.task.result).toBeUndefined()
99103
})
100104

101105
it('aborts the task when abort() is called while pending', async () => {

packages/mst-async-task/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mst-async-task",
3-
"version": "1.0.3",
3+
"version": "1.0.4",
44
"description": "Manage the lifecycles of asynchronous flows in Mobx-State-Tree",
55
"main": "dist/mst-async-task.js",
66
"umd:main": "dist/mst-async-task.umd.js",

packages/mst-async-task/src/AsyncTask.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ export const AsyncTask = types
1717
]),
1818
AsyncTaskStatus.INIT
1919
),
20-
error: types.maybe(types.frozen<Error>())
20+
error: types.maybe(types.frozen<Error>()),
21+
result: types.maybe(types.frozen<any>())
2122
})
2223
.views(self => {
2324
return {
@@ -62,14 +63,16 @@ export const AsyncTask = types
6263
abort()
6364
self.status = AsyncTaskStatus.INIT
6465
self.error = undefined
66+
self.result = undefined
6567
}
6668

6769
/**
6870
* Used internally by `runTask()`. This should not be called directly.
6971
*/
70-
const _resolve = (status: AsyncTaskStatus, error?: Error) => {
72+
const _resolve = (status: AsyncTaskStatus, error?: Error, result?: any) => {
7173
self.status = status
7274
self.error = error
75+
self.result = result
7376
delete (self as IAsyncTask)._abortController
7477
}
7578

packages/mst-async-task/src/lib.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ export enum AsyncTaskStatus {
99
export class AsyncTaskResult {
1010
status: AsyncTaskStatus
1111
error?: Error
12+
value?: any
1213

13-
constructor(status: AsyncTaskStatus, error?: Error) {
14+
constructor(status: AsyncTaskStatus, error?: Error, value?: any) {
1415
this.status = status
1516
this.error = error
17+
this.value = value
1618
}
1719
}
1820

packages/mst-async-task/src/runTask.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ export async function runTask(
109109
}
110110

111111
return result
112-
} catch (error) {
112+
} catch (err) {
113113
parentAbortSignal = null
114-
throw error
114+
throw err
115115
}
116116
}
117117

@@ -122,10 +122,10 @@ export async function runTask(
122122
task.error = undefined
123123
task._abortController = abortController
124124

125-
const [status, error]: [AsyncTaskStatus, Error?] = await new Promise(async resolve => {
126-
const done = (result: [AsyncTaskStatus, Error?]) => {
125+
const [status, error, result]: [AsyncTaskStatus, Error?, any?] = await new Promise(async resolve => {
126+
const done = (args: [AsyncTaskStatus, Error?, any?]) => {
127127
signal.removeEventListener('abort', abortHandler)
128-
resolve(result)
128+
resolve(args)
129129
}
130130

131131
const abortHandler = () => {
@@ -142,20 +142,20 @@ export async function runTask(
142142
signal.addEventListener('abort', abortHandler)
143143

144144
try {
145-
await flow(generator)({ signal, exec })
146-
done([AsyncTaskStatus.COMPLETE])
147-
} catch (error) {
148-
if (error instanceof AsyncTaskAbortError) {
149-
done([AsyncTaskStatus.ABORTED, error])
145+
const result = await flow(generator)({ signal, exec })
146+
done([AsyncTaskStatus.COMPLETE, undefined, result])
147+
} catch (err) {
148+
if (err instanceof AsyncTaskAbortError) {
149+
done([AsyncTaskStatus.ABORTED, err])
150150
} else {
151-
done([AsyncTaskStatus.FAILED, error])
151+
done([AsyncTaskStatus.FAILED, err])
152152
}
153153
}
154154
})
155155

156156
if (isAlive(task) && task.pending && !signal.aborted) {
157-
task._resolve(status, error)
157+
task._resolve(status, error, result)
158158
}
159159

160-
return new AsyncTaskResult(status, error)
160+
return new AsyncTaskResult(status, error, result)
161161
}

0 commit comments

Comments
 (0)