检查对象是否是一个有前途的函数

3

在protractor.js中,

我有一些使用promise/defer的函数。例如:

var myFunc = function(_params) {
  var deferred = protractor.promise.defer();
  /***do magical code things****/
  /***wait for other promises***/
  /*****deferred.fulfill();*****/
  return deferred.promise;
};

有哪些组合的 typeof 语句可以用来检查这个事物(在传递给其他人时)是否为 promise?
  • typeof promiseMaybe === 'function'
  • typeof promiseMaybe.then === 'function'
    • && 与之前的操作一起使用?
还是有一个非 typeof 的函数可以使用,比如...
  • promiseMaybe.isThenable
  • protractor.promise.isThenable(promiseMaybe)

说明

我有一个方法将会接收 myFunc 作为参数,但是这个方法也可能接收字符串和查找器。我需要知道如何判断参数是否为承诺某些东西的函数,可能是在调用函数之前。

我想检查这个函数。我有一个方法,它将调用 browser.wait( maybePromise ),我想知道该方法是否接收到了一个有前途的函数作为参数,还是一个需要转换的字符串。 - Josh Longerbeam
这是您需要区分的唯一两个选项吗(函数或字符串)?这更加直接/可能。(是的,确定函数是否返回承诺是不可能的,因为您可以创建一个仅有时返回承诺的函数。) - Ry-
我猜我可以假设如果它接收一个函数,那么它一定是一个有前途的函数。虽然我不想这样假设,但我仍然想知道是否可能区分。 - Josh Longerbeam
我在括号里说了为什么它不是这样。你不能在调用时检查它的返回值吗? - Ry-
抱歉,我的脑海中没有意识到括号已经回答了我的问题。所以我想我只需要检查 typeof returnValue.then === 'function' 是否成立? - Josh Longerbeam
显示剩余3条评论
1个回答

3

在Protractor中有一个辅助方法 - protractor.promise.isPromise()

var el = element(by.css('foo'));

protractor.promise.isPromise('foo'); // false
protractor.promise.isPromise(el); // false
protractor.promise.isPromise(el.click()); // true

Protractor 直接从 selenium-webdriver 中采用了这个方法,你可以在这里找到该方法的源代码

/**
 * Determines whether a {@code value} should be treated as a promise.
 * Any object whose "then" property is a function will be considered a promise.
 *
 * @param {*} value The value to test.
 * @return {boolean} Whether the value is a promise.
 */
promise.isPromise = function(value) {
  return !!value && goog.isObject(value) &&
      // Use array notation so the Closure compiler does not obfuscate away our
      // contract. Use typeof rather than goog.isFunction because
      // goog.isFunction accepts instanceof Function, which the promise spec
      // does not.
      typeof value['then'] === 'function';
};

基本上,任何具有then方法的对象都被视为Promise。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接