Kernel-Promises.st 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. Smalltalk createPackage: 'Kernel-Promises'!
  2. Object subclass: #Thenable
  3. instanceVariableNames: ''
  4. package: 'Kernel-Promises'!
  5. !Thenable commentStamp!
  6. I am the abstract base class for Promises.
  7. My subclasses should wrap existing JS implementations.
  8. I contain methods that wrap Promises/A+ `.then` behaviour.!
  9. !Thenable methodsFor: 'promises'!
  10. all: nadicBlock
  11. <return self.then(function (array) {
  12. return nadicBlock._valueWithPossibleArguments_(array);
  13. })>
  14. !
  15. catch: aBlock
  16. <return self.then(null, function (err) {
  17. return aBlock._value_(err);
  18. })>
  19. !
  20. on: aClass do: aBlock
  21. <return self.then(null, function (err) {
  22. if (err._isKindOf_(aClass)) return aBlock._value_(err);
  23. else throw err;
  24. })>
  25. !
  26. on: aClass do: aBlock catch: anotherBlock
  27. <return self.then(null, function (err) {
  28. try { if (err._isKindOf_(aClass)) return aBlock._value_(err); } catch (e) { err = e; }
  29. return anotherBlock._value_(err);
  30. })>
  31. !
  32. then: aBlockOrArray
  33. <
  34. var array = Array.isArray(aBlockOrArray) ? aBlockOrArray : [aBlockOrArray];
  35. return array.reduce(function (soFar, aBlock) {
  36. return soFar.then(function (result) {
  37. return aBlock._value_(result);
  38. });
  39. }, self)>
  40. ! !
  41. Thenable subclass: #Promise
  42. instanceVariableNames: ''
  43. package: 'Kernel-Promises'!
  44. !JSObjectProxy methodsFor: '*Kernel-Promises'!
  45. all: nadicBlock
  46. <var js = self["@jsObject"];
  47. if (typeof js.then === "function")
  48. return $globals.Thenable.fn.prototype._all_.call(js, nadicBlock);
  49. else
  50. return self._doesNotUnderstand_(
  51. $globals.Message._new()
  52. ._selector_("all:")
  53. ._arguments_([nadicBlock])
  54. )>
  55. !
  56. catch: aBlock
  57. <var js = self["@jsObject"];
  58. if (typeof js.then === "function")
  59. return $globals.Thenable.fn.prototype._catch_.call(js, aBlock);
  60. else
  61. return self._doesNotUnderstand_(
  62. $globals.Message._new()
  63. ._selector_("catch:")
  64. ._arguments_([aBlock])
  65. )>
  66. !
  67. on: aClass do: aBlock
  68. <var js = self["@jsObject"];
  69. if (typeof js.then === "function")
  70. return $globals.Thenable.fn.prototype._on_do_.call(js, aClass, aBlock);
  71. else
  72. return self._doesNotUnderstand_(
  73. $globals.Message._new()
  74. ._selector_("on:do:")
  75. ._arguments_([aClass, aBlock])
  76. )>
  77. !
  78. on: aClass do: aBlock catch: anotherBlock
  79. <var js = self["@jsObject"];
  80. if (typeof js.then === "function")
  81. return $globals.Thenable.fn.prototype._on_do_catch_.call(js, aClass, aBlock, anotherBlock);
  82. else
  83. return self._doesNotUnderstand_(
  84. $globals.Message._new()
  85. ._selector_("on:do:catch:")
  86. ._arguments_([aClass, aBlock, anotherBlock])
  87. )>
  88. !
  89. then: aBlock
  90. <var js = self["@jsObject"];
  91. if (typeof js.then === "function")
  92. return $globals.Thenable.fn.prototype._then_.call(js, aBlock);
  93. else
  94. return self._doesNotUnderstand_(
  95. $globals.Message._new()
  96. ._selector_("then:")
  97. ._arguments_([aBlock])
  98. )>
  99. ! !