@@ -805,6 +805,78 @@ Describe Async.Promise
805
805
End
806
806
End
807
807
808
+ Describe .chain()
809
+ It returns a promise which resolves to an empty List when an empty factories has specified
810
+ let l = l:
811
+ let p = P.chain([]).then({ v -> extend(l, { 'result': v })})
812
+ call s:wait_has_key(l, 'result')
813
+ Assert Equals(result, [])
814
+ Assert Equals(p._state, FULFILLED)
815
+ End
816
+
817
+ It sequentially calls functions in factories and resolves promises
818
+ let l = l:
819
+ let fs = [
820
+ \ { -> P.resolve('Hello') },
821
+ \ { -> P.resolve('World') },
822
+ \ { -> P.resolve('Goodbye') },
823
+ \]
824
+ let p = P.chain(fs).then({ v -> extend(l, { 'result': v })})
825
+ call s:wait_has_key(l, 'result')
826
+ Assert Equals(result, ['Hello', 'World', 'Goodbye'])
827
+ Assert Equals(p._state, FULFILLED)
828
+ End
829
+
830
+ It sequentially calls functions in factories but reject promises if intermediate function call fails
831
+ let l = l:
832
+ call P.on_unhandled_rejection({ result -> extend(l, { 'result': result }) })
833
+
834
+ let fs = [
835
+ \ { -> P.resolve('Hello').then({ -> extend(l, { 'Hello': 1 }) }) },
836
+ \ { -> execute('throw HOGE') },
837
+ \ { -> P.resolve('Goodbye').then({ -> extend(l, { 'Goodbye': 1 }) }) },
838
+ \]
839
+ let p = P.chain(fs).then({ -> execute('throw "error"') })
840
+ call s:wait_has_key(l, 'result')
841
+ Assert HasKey(result, 'exception')
842
+ Assert HasKey(result, 'throwpoint')
843
+ Assert Equals(p._state, REJECTED)
844
+ Assert HasKey(l, 'Hello')
845
+ Assert KeyNotExists(l, 'Goodbye')
846
+ End
847
+
848
+ It sequentially calls functions in factories but reject promises if intermediate promise reject
849
+ let l = l:
850
+ call P.on_unhandled_rejection({ result -> extend(l, { 'result': result }) })
851
+
852
+ let fs = [
853
+ \ { -> P.resolve('Hello').then({ -> extend(l, { 'Hello': 1 }) }) },
854
+ \ { -> P.resolve('World').then({ -> extend(l, { 'World': 1 }) }).then({ -> P.reject('Wow')}) },
855
+ \ { -> P.resolve('Goodbye').then({ -> extend(l, { 'Goodbye': 1 }) }) },
856
+ \]
857
+ let p = P.chain(fs).then({ -> execute('throw "error"') })
858
+ call s:wait_has_key(l, 'result')
859
+ Assert Equals(result, 'Wow')
860
+ Assert Equals(p._state, REJECTED)
861
+ Assert HasKey(l, 'Hello')
862
+ Assert HasKey(l, 'World')
863
+ Assert KeyNotExists(l, 'Goodbye')
864
+ End
865
+
866
+ It sequentially calls functions in factories beyonds &maxfuncdepth and resolves promises
867
+ let l = l:
868
+ let fs = map(
869
+ \ range(&maxfuncdepth * 2),
870
+ \ { k -> { -> P.new({r -> r(k) }) } },
871
+ \)
872
+ let p = P.chain(fs).then({ v -> extend(l, { 'result': v })})
873
+ call s:wait_has_key(l, 'result')
874
+ Assert Equals(len(result), &maxfuncdepth * 2)
875
+ Assert Equals(result, range(&maxfuncdepth * 2))
876
+ Assert Equals(p._state, FULFILLED)
877
+ End
878
+ End
879
+
808
880
Describe .on_unhandled_rejection
809
881
810
882
After each
0 commit comments