mirror of
https://github.com/flynx/actions.js.git
synced 2025-10-28 09:50:10 +00:00
added MetaActions.callSortedAction(..)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
fd15b37cd3
commit
fca286be32
42
README.md
42
README.md
@ -522,6 +522,48 @@ Example:
|
|||||||
- This is pointless outside of an action call, thus an exception will be thrown.
|
- This is pointless outside of an action call, thus an exception will be thrown.
|
||||||
|
|
||||||
|
|
||||||
|
#### 6. Calling action handlers sorted independently of the prototype chain
|
||||||
|
|
||||||
|
This sorts action handlers by priority `.sortedActionPriority` then
|
||||||
|
order and calls them.
|
||||||
|
|
||||||
|
This protocol enables us to call actions in a deterministic order
|
||||||
|
independent of the order the handlers are defined in the prototype chain.
|
||||||
|
|
||||||
|
```
|
||||||
|
<action-set>.callSortedAction(name, ...args)
|
||||||
|
-> this
|
||||||
|
```
|
||||||
|
|
||||||
|
Example action:
|
||||||
|
```javascript
|
||||||
|
someAction: [
|
||||||
|
{ sortedActionPriority: 'high' },
|
||||||
|
function(){
|
||||||
|
...
|
||||||
|
}],
|
||||||
|
```
|
||||||
|
|
||||||
|
`sortedActionPriority` can take the following values:
|
||||||
|
- *number*
|
||||||
|
- `'high'` (equivalent to `50`)
|
||||||
|
- `'normal'` (equivalent to `0`)
|
||||||
|
- `'low'` (equivalent to `-50`)
|
||||||
|
|
||||||
|
The greater the priority the earlier the handler is called. Handlers with
|
||||||
|
prioorities greater than `0` will always precede the unprioretized (i.e.
|
||||||
|
`.sortedActionPriority` unset, `null` or `0`) handlers; Handlers with
|
||||||
|
prioorities less than `0` will always follow the unprioretized handlers.
|
||||||
|
Unprioretized handlers keep their relative order.
|
||||||
|
|
||||||
|
**Notes:**
|
||||||
|
- `.callSortedAction(..)` ignores handler return values by design. This is
|
||||||
|
done to prevent actions competing to return a value.
|
||||||
|
- if action name does not exist this will do nothing and return normally
|
||||||
|
(without error)...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Alias protocols:
|
### Alias protocols:
|
||||||
|
|
||||||
1. Defining aliases in runtime (MetaActions)
|
1. Defining aliases in runtime (MetaActions)
|
||||||
|
|||||||
50
actions.js
50
actions.js
@ -1821,6 +1821,56 @@ module.MetaActions = {
|
|||||||
chainCall: function(outer, inner){
|
chainCall: function(outer, inner){
|
||||||
return this[outer].chainApply(this, inner, args2array(arguments).slice(2)) },
|
return this[outer].chainApply(this, inner, args2array(arguments).slice(2)) },
|
||||||
|
|
||||||
|
|
||||||
|
// Call action handlers serted by .sortedActionPriority...
|
||||||
|
//
|
||||||
|
// NOTE: this by design ignores the action call results to avoid
|
||||||
|
// actions competing on who will return a value...
|
||||||
|
// NOTE: if action name does not exist this will do nothing and
|
||||||
|
// return normally (without error)...
|
||||||
|
// NOTE: this essentially re-implements parts of the .pre(..)/.post(..)
|
||||||
|
// action protocol...
|
||||||
|
// NOTE: this may not support some legacy action protocol features...
|
||||||
|
callSortedAction: function(name, ...args){
|
||||||
|
var that = this
|
||||||
|
this.getHandlers(name)
|
||||||
|
.map(function(h, i){
|
||||||
|
var p = (h.pre || {}).sortedActionPriority
|
||||||
|
// normalize priority...
|
||||||
|
p = p == 'high' ?
|
||||||
|
50
|
||||||
|
: p == 'normal' ?
|
||||||
|
0
|
||||||
|
: p == 'low' ?
|
||||||
|
-50
|
||||||
|
: p
|
||||||
|
return [i, p, h] })
|
||||||
|
// sort by .sortedActionPriority ascending...
|
||||||
|
.sort(function([ia, pa, a], [ib, pb, b]){
|
||||||
|
return (pa != null && pb != null) ?
|
||||||
|
pa - pb
|
||||||
|
: (pa > 0 || pb < 0) ?
|
||||||
|
1
|
||||||
|
: (pb > 0 || pa < 0) ?
|
||||||
|
-1
|
||||||
|
: ia - ib })
|
||||||
|
// the list should be ordered descending form highest
|
||||||
|
// priority or closeness to root action...
|
||||||
|
.reverse()
|
||||||
|
// call the actions (pre)...
|
||||||
|
.map(function([i, p, a]){
|
||||||
|
return a.pre ?
|
||||||
|
a.pre.call(that, ...args)
|
||||||
|
: a.post })
|
||||||
|
.reverse()
|
||||||
|
// call the actions (post)...
|
||||||
|
// NOTE: we do not care about call results here...
|
||||||
|
.forEach(function(func){
|
||||||
|
func instanceof Function
|
||||||
|
&& func.call(that, ...args) }) },
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Get action/method resolution order...
|
// Get action/method resolution order...
|
||||||
//
|
//
|
||||||
// List mixin tags...
|
// List mixin tags...
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ig-actions",
|
"name": "ig-actions",
|
||||||
"version": "3.23.0",
|
"version": "3.24.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "actions.js",
|
"main": "actions.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user