Kernel-Promises.st 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. then: aBlockOrArray catch: anotherBlock
  42. ^ (self then: aBlockOrArray) catch: anotherBlock
  43. !
  44. then: aBlockOrArray on: aClass do: aBlock
  45. ^ (self then: aBlockOrArray) on: aClass do: aBlock
  46. !
  47. then: aBlockOrArray on: aClass do: aBlock catch: anotherBlock
  48. ^ ((self then: aBlockOrArray) on: aClass do: aBlock) catch: anotherBlock
  49. ! !
  50. Thenable subclass: #Promise
  51. instanceVariableNames: ''
  52. package: 'Kernel-Promises'!
  53. !JSObjectProxy methodsFor: '*Kernel-Promises'!
  54. all: nadicBlock
  55. <var js = self["@jsObject"];
  56. if (typeof js.then === "function")
  57. return $globals.Thenable.fn.prototype._all_.call(js, nadicBlock);
  58. else
  59. return self._doesNotUnderstand_(
  60. $globals.Message._new()
  61. ._selector_("all:")
  62. ._arguments_([nadicBlock])
  63. )>
  64. !
  65. catch: aBlock
  66. <var js = self["@jsObject"];
  67. if (typeof js.then === "function")
  68. return $globals.Thenable.fn.prototype._catch_.call(js, aBlock);
  69. else
  70. return self._doesNotUnderstand_(
  71. $globals.Message._new()
  72. ._selector_("catch:")
  73. ._arguments_([aBlock])
  74. )>
  75. !
  76. on: aClass do: aBlock
  77. <var js = self["@jsObject"];
  78. if (typeof js.then === "function")
  79. return $globals.Thenable.fn.prototype._on_do_.call(js, aClass, aBlock);
  80. else
  81. return self._doesNotUnderstand_(
  82. $globals.Message._new()
  83. ._selector_("on:do:")
  84. ._arguments_([aClass, aBlock])
  85. )>
  86. !
  87. on: aClass do: aBlock catch: anotherBlock
  88. <var js = self["@jsObject"];
  89. if (typeof js.then === "function")
  90. return $globals.Thenable.fn.prototype._on_do_catch_.call(js, aClass, aBlock, anotherBlock);
  91. else
  92. return self._doesNotUnderstand_(
  93. $globals.Message._new()
  94. ._selector_("on:do:catch:")
  95. ._arguments_([aClass, aBlock, anotherBlock])
  96. )>
  97. !
  98. then: aBlock
  99. <var js = self["@jsObject"];
  100. if (typeof js.then === "function")
  101. return $globals.Thenable.fn.prototype._then_.call(js, aBlock);
  102. else
  103. return self._doesNotUnderstand_(
  104. $globals.Message._new()
  105. ._selector_("then:")
  106. ._arguments_([aBlock])
  107. )>
  108. ! !