-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patham-sample-ext.js
88 lines (74 loc) · 2.48 KB
/
am-sample-ext.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// =================== STANDARD HEADING =====================
// Comes first
//
let am,
// asyncMethods = require('async-methods')
asyncMethods = require('./am.js')
class ExtendedPromise extends asyncMethods.ExtendedPromise {
constructor(fn, context) {
super(fn, context)
let self = this
this._state_ = context || {}
this._state_.timer = this._state_.timer || +new Date()
this._state_.prev = this._state_.prev || null
}
// ===============================================================
// new prototype methods of ExtendedPromise
// NB preferable not to use async as methods with reurn Promises not ExtendedPromises,
// but can use static
// ===============================================================
// returns previous 2 results (last and one before) in chain
twoPrevious(fn) {
let self = this,
prev = (self._state_ && self._state_.prev) || null,
transform,
newContext = this._state_
let argsHaveClass = am.argumentsHaveClass(arguments)
newContext.prev = this
transform = function(resolve, reject, result, err) {
let newResult,
prevExtendedPromises = [self]
if (prev) {
prevExtendedPromises.push(prev)
}
/* if(newContext.prev._state_ && newContext.prev._state_.prev){
args.push(newContext.prev)
}*/
am.all(prevExtendedPromises).next(function(args) {
if (argsHaveClass) {
let newResult
try {
newResult = asyncMethods.ExtendedPromise._applyResultToClass(argsHaveClass, args)
newResult.next(resolve).catch(reject)
} catch (e) {
reject(e)
}
} else if (typeof fn === 'function') {
try {
newResult = fn.apply(self, args)
am(newResult)
.next(resolve)
.error(reject)
} catch (e) {
reject(e)
}
}
})
}
return asyncMethods.ExtendedPromise._chain(self, newContext)(transform)
}
}
//
//========== This line comes between the ExtendedPromise class and any new static methods of am ============
//
// back extend async methods ExtendedPromise class
am = asyncMethods._extend(ExtendedPromise)
// ===========================================================================================================
am.trivial = function() {
let self = this,
something = arguments[0] || null
// ... do something
// return ExtendedPromise
return am(something)
}
module.exports = am