Future 上的辅助方法

isFuture 方法

  1. Future.isFuture(obj)

用来判断是否是 Future 的实例对象。

isPromise 方法

  1. Future.isPromise(obj)

用来判断是否是 Future 或 ECMAScript 6 的 Promise 实例对象。

注意,该方法对其它符合 Promise/A+ 规范实现的 thenable 对象进行判断的返回值是 false

如果你需要一个 promise 对象,保险的做法是用 Future.value() 方法包装一下。

toPromise 方法

  1. Future.toPromise(obj)

如果 obj 是一个 Promise 对象,那么直接返回 obj,否则返回 Future.value(obj)

all 方法

  1. Future.all(array)

该方法返回一个 promise 对象,该 promise 对象会在数组参数内的所有 promise 都被设置为成功(fulfilled)状态时,才被设置为成功(fulfilled)状态,其值为数组参数中所有 promise 对象的最终展开值组成的数组,其数组元素与原数组元素一一对应。

具体使用方法可参见:MDN: Promise.all()

Future.all 方法与 Promise.all 方法在参数上有一点区别,Future.all 方法的数组参数本身也可以是一个值为数组的 promise 对象。

race 方法

  1. Future.race(array)

该方法返回一个 promise 对象,这个 promise 在数组参数中的任意一个 promise 被设置为成功(fulfilled)或失败(rejected)后,立刻以相同的成功值被设置为成功(fulfilled)或以相同的失败原因被设置为失败(rejected)。

具体使用方法可参见:MDN: Promise.race()

Future.race 方法与 Promise.race 方法在参数上有一点区别,Future.race 方法的数组参数本身也可以是一个值为数组的 promise 对象。

join 方法

  1. Future.join([arg1[, arg2[, arg3...]]]);

该方法的功能同 all 方法类似,但它与 all 方法的参数不同,我们来举例看一下它们的差别:

  1. var Future = hprose.Future;
  2.  
  3. var promise = Future.resolve(3);
  4.  
  5. Future.all([true, promise])
  6. .then(function(values) {
  7. console.log(values);
  8. });
  9.  
  10. Future.join(true, promise)
  11. .then(function(values) {
  12. console.log(values);
  13. });

输出结果如下:


  1. [ true, 3 ]
  2. [ true, 3 ]

any 方法

  1. Future.any(array)

该方法是 race 方法的改进版。

对于 race 方法,如果输入的数组为空,返回的 promise 对象将永远保持为待定(pending)状态。

而对于 any 方法,如果输入的数组为空,返回的 promise 对象将被设置为失败状态,失败原因是一个 RangeError 对象。

对于 race 方法,数组参数中的任意一个 promise 被设置为成功(fulfilled)或失败(rejected)后,返回的 promise 对象就会被设定为成功(fulfilled)或失败(rejected)状态。

而对于 any 方法,只有当数组参数中的所有 promise 被设置为失败状态时,返回的 promise 对象才会被设定为失败状态。否则,返回的 promise 对象被设置为第一个被设置为成功(fulfilled)状态的成功值。

settle 方法

  1. Future.settle(array)

该方法返回一个 promise 对象,该 promise 对象会在数组参数内的所有 promise 都被设置为成功(fulfilled)状态或失败(rejected)状态时,才被设置为成功(fulfilled)状态,其值为数组参数中所有 promise 对象的 inspect 方法返回值,其数组元素与原数组元素一一对应。

例如:

  1. var Future = hprose.Future;
  2.  
  3. var p1 = Future.resolve(3);
  4. var p2 = Future.reject("x");
  5.  
  6. Future.settle([true, p1, p2])
  7. .then(function(values) {
  8. console.log(values);
  9. });

输出结果为:


  1. [ { state: 'fulfilled', value: true },
  2. { state: 'fulfilled', value: 3 },
  3. { state: 'rejected', reason: 'x' } ]

attempt 方法

  1. Future.attempt(handler[, arg1[, arg2[, arg3...]]]);

attempt 方法的作用是异步执行 handler 函数并返回一个包含执行结果的 promise 对象,handler 的参数分别为 arg1, arg2, arg3 …。参数可以是普通值,也可以是 promise 对象,如果是 promise 对象,则等待其变为成功(fulfilled)状态时再将其成功值代入 handler 函数。如果变为失败(rejected)状态,attempt 返回的 promise 对象被设置为该失败原因。如果参数中,有多个 promise 对象变为失败(rejected)状态,则第一个变为失败状态的 promise 对象的失败原因被设置为 attempt 返回的 promise 对象的失败原因。当参数中的 promise 对象都变为成功(fulfilled)状态时,handler 函数才会执行,如果在 handler 执行的过程中,抛出了异常,则该异常作为 attempt 返回的 promise 对象的失败原因。如果没有异常,则 handler 函数的返回值,作为 attempt 返回的 promise 对象的成功值。

  1. var Future = hprose.Future;
  2.  
  3. function add(a, b) {
  4. return a + b;
  5. }
  6.  
  7. var p1 = Future.resolve(3);
  8.  
  9. Future.attempt(add, 2, p1)
  10. .then(function(value) {
  11. console.log(value);
  12. });

输出结果为:


  1. 5

run 方法

  1. Future.run(handler[, thisArg[, arg1[, arg2[, arg3...]]]]);

run 方法跟上面的 attempt 方法功能类似,唯一的区别是 run 方法的第二个参数为 thisArg,他表示 handler 的执行上下文。当 thisArg 的值为 undefine 时,行为跟 attempt 方法完全一致。

例如:

  1. var Future = hprose.Future;
  2.  
  3. function add(a, b) {
  4. return a + b;
  5. }
  6.  
  7. var p1 = Future.resolve(3);
  8.  
  9. Future.run(console.log, console, Future.attempt(add, 2, p1));

输出结果为:


  1. 5

wrap 方法

  1. Future.wrap(handler[, thisArg]);

wrap 方法返回一个包装好的函数,该函数的执行方式跟使用 Future.run 的效果一样。例如:

  1. var Future = hprose.Future;
  2.  
  3. var add = Future.wrap(function(a, b) {
  4. return a + b;
  5. });
  6.  
  7. var log = Future.wrap(console.log, console);
  8.  
  9. var p1 = Future.resolve(3);
  10.  
  11. log(add(2, p1));

输出结果为:


  1. 5

forEach 方法

  1. Future.forEach(array, callback[, thisArg])

该方法你可以认为是 Array.forEachpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

  1. var Future = hprose.Future;
  2.  
  3. function logArrayElements(element, index, array) {
  4. console.log('a[' + index + '] = ' + element);
  5. }
  6.  
  7. // Note elision, there is no member at 2 so it isn't visited
  8. Future.forEach([2, Future.value(5), , 9], logArrayElements);

输出结果为:


  1. a[0] = 2
  2. a[1] = 5
  3. a[3] = 9

every 方法

  1. Future.every(array, callback[, thisArg])

该方法你可以认为是 Array.everypromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function isBigEnough(element, index, array) {
  6. return element >= 10;
  7. }
  8.  
  9. var a1 = [12, Future.value(5), 8, Future.value(130), 44];
  10. var a2 = [12, Future.value(54), 18, Future.value(130), 44];
  11. var a3 = Future.value(a1);
  12. var a4 = Future.value(a2);
  13. log(Future.every(a1, isBigEnough)); // false
  14. log(Future.every(a2, isBigEnough)); // true
  15. log(Future.every(a3, isBigEnough)); // false
  16. log(Future.every(a4, isBigEnough)); // true

输出结果为:


  1. false
  2. true
  3. false
  4. true

some 方法

  1. Future.some(array, callback[, thisArg])

该方法你可以认为是 Array.somepromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function isBiggerThan10(element, index, array) {
  6. return element > 10;
  7. }
  8.  
  9. var a1 = [2, Future.value(5), 8, Future.value(1), 4];
  10. var a2 = [12, Future.value(5), 8, Future.value(1), 4];
  11. var a3 = Future.value(a1);
  12. var a4 = Future.value(a2);
  13. log(Future.some(a1, isBiggerThan10)); // false
  14. log(Future.some(a2, isBiggerThan10)); // true
  15. log(Future.some(a3, isBiggerThan10)); // false
  16. log(Future.some(a4, isBiggerThan10)); // true

输出结果为:


  1. false
  2. true
  3. false
  4. true

filter 方法

  1. Future.filter(array, callback[, thisArg])

该方法你可以认为是 Array.filterpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function isBigEnough(value) {
  6. return value >= 10;
  7. }
  8.  
  9. var a1 = [12, Future.value(5), 8, Future.value(130), 44];
  10. var a2 = Future.value(a1);
  11. log(Future.filter(a1, isBigEnough));
  12. log(Future.filter(a2, isBigEnough));

输出结果为:


  1. [ 12, 130, 44 ]
  2. [ 12, 130, 44 ]

map 方法

  1. Future.map(array, callback[, thisArg])

该方法你可以认为是 Array.mappromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. var numbers = [1, Future.value(4), Future.value(9)];
  6. log(Future.map(numbers, Math.sqrt));
  7. log(Future.map(numbers, function(num) {
  8. return num * 2;
  9. }));

输出结果为:


  1. [ 1, 2, 3 ]
  2. [ 2, 8, 18 ]

reduce 方法

  1. Future.reduce(array, callback[, initialValue])

该方法你可以认为是 Array.reducepromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

initialValue 的值也可以是一个 promise 对象。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. var numbers = [Future.value(0), 1, Future.value(2), 3, Future.value(4)];
  6.  
  7. function callback(previousValue, currentValue, index, array) {
  8. return previousValue + currentValue;
  9. }
  10.  
  11. log(Future.reduce(numbers, callback));
  12. log(Future.reduce(numbers, callback, 10));
  13. log(Future.reduce(numbers, callback, Future.value(20)));

输出结果为:


  1. 10
  2. 20
  3. 30

reduceRight 方法

  1. Future.reduceRight(array, callback[, initialValue])

该方法你可以认为是 Array.reduceRightpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。如果在 callback 回调中抛出了异常,则该方法返回的 promise 对象也被设置为失败(rejected)状态,失败原因被设置为抛出的异常值。

initialValue 的值也可以是一个 promise 对象。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function concat(a, b) {
  6. return a.concat(b);
  7. }
  8.  
  9. var array = [[0, 1], Future.value([2, 3]), Future.value([4, 5])];
  10.  
  11. log(Future.reduceRight(array, concat, []));
  12. log(Future.reduceRight(array, concat, Future.value([6, 7])));

输出结果为:


  1. [ 4, 5, 2, 3, 0, 1 ]
  2. [ 6, 7, 4, 5, 2, 3, 0, 1 ]

indexOf 方法

  1. Future.indexOf(array, searchElement[, fromIndex])

该方法你可以认为是 Array.indexOfpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。

searchElement 的值也可以是一个 promise 对象。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. var array = [1, Future.value(2), Future.value(3)];
  6.  
  7. log(Future.indexOf(array, 2));
  8. log(Future.indexOf(array, Future.value(3), 1));
  9. log(Future.indexOf(array, 1, 1));

输出结果为:


  1. 1
  2. 2
  3. -1

lastIndexOf 方法

  1. Future.lastIndexOf(array, searchElement[, fromIndex])

该方法你可以认为是 Array.lastIndexOfpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。

searchElement 的值也可以是一个 promise 对象。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. var array = [1, Future.value(2), Future.value(3)];
  6.  
  7. log(Future.lastIndexOf(array, 2));
  8. log(Future.lastIndexOf(array, Future.value(3), 1));
  9. log(Future.lastIndexOf(array, 1, 1));

输出结果为:


  1. 1
  2. -1
  3. 0

includes 方法

  1. Future.includes(array, searchElement[, fromIndex])

该方法你可以认为是 Array.includespromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。

searchElement 的值也可以是一个 promise 对象。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. var array = [1, Future.value(2), Future.value(3)];
  6.  
  7. log(Future.includes(array, 2));
  8. log(Future.includes(array, Future.value(3), 1));
  9. log(Future.includes(array, 1, 1));

输出结果为:


  1. true
  2. true
  3. false

find 方法

  1. Future.find(array, predicate[, thisArg])

该方法你可以认为是 Array.findpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。predicate 是一个回调方法。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function isPrime(element, index, array) {
  6. var start = 2;
  7. while (start <= Math.sqrt(element)) {
  8. if (element % start++ < 1) {
  9. return false;
  10. }
  11. }
  12. return element > 1;
  13. }
  14.  
  15. var array1 = [4, Future.value(6), 8, Future.value(12)];
  16. var array2 = [4, Future.value(5), 7, Future.value(12)];
  17.  
  18. log(Future.find(array1, isPrime));
  19. log(Future.find(array2, isPrime));

输出结果为:


  1. undefined
  2. 5

findIndex 方法

  1. Future.findIndex(array, predicate[, thisArg])

该方法你可以认为是 Array.findIndexpromise 版本,其中参数 array 可以是一个包含了 promise 元素的数组,也可以是一个包含了数组的 promise 对象。返回值是一个 promise 对象。如果参数数组中的 promise 对象为失败(rejected)状态,则该方法返回的 promise 对象被设置为失败(rejected)状态,且设为相同失败原因。predicate 是一个回调方法。

  1. var Future = hprose.Future;
  2.  
  3. var log = Future.wrap(console.log, console);
  4.  
  5. function isPrime(element, index, array) {
  6. var start = 2;
  7. while (start <= Math.sqrt(element)) {
  8. if (element % start++ < 1) {
  9. return false;
  10. }
  11. }
  12. return element > 1;
  13. }
  14.  
  15. var array1 = [4, Future.value(6), 8, Future.value(12)];
  16. var array2 = [4, Future.value(5), 7, Future.value(12)];
  17.  
  18. log(Future.findIndex(array1, isPrime));
  19. log(Future.findIndex(array2, isPrime));

输出结果为:

  1. -1
  2. 1