如何检查JavaScript函数是否返回Promise?

时间:2017-04-14 17:22:06

标签: javascript function promise

说我有两个功能:

function f1() {
    return new Promise<any>((resolve, reject) => {
        resolve(true);
    });
}

function f2() {
}

我如何知道f1是否会返回Promisef2不会?

3 个答案:

答案 0 :(得分:11)

调用该函数,使用instanceof

let possiblePromise = f1();
let isPromise = possiblePromise instanceof Promise;

答案 1 :(得分:6)

所以它只是规范化输出。然后通过Promise.resolve()和co。

运行它
var possiblePromise = f1();
var certainPromise = Promise.resolve(possiblePromise).then(...);

var possiblePromises = [f1(), f2()];
Promise.all(possiblePromises).then(values => ...);

但是你需要对这些函数返回的基本概念有所了解。例如:两个示例都将失败

function f3(){
    return [somePromise, someOtherPromise];
}

var arrayOfPromisesOrValues = f3();

//here you'll still deal with an Array of Promises in then();
Promise.resolve(arrayOfPromisesOrValues).then(console.log); 
//neither does this one recognize the nested Promises
Promise.all([ f1(), f2(), f3() ]).then(console.log);

//only these will do:
Promise.all(f3()).then(console.log);
Promise.all([ f1(), f2(), Promise.all(f3()) ]).then(console.log);

您需要知道f3返回一个Promises或值数组并处理它。就像您需要知道f1f2返回值或值的承诺一样。

底线:您需要具备函数返回的基本知识,以便能够通过正确的函数运行结果来解析承诺。

答案 2 :(得分:0)

这无法完成。

但是,您可以任何函数强制转换为Promise返回函数。这就是我在这里所做的。

&#13;
&#13;
const toPromise = function (f) {
  return function () {
    return new Promise((resolve, reject) => {
      const result = f.apply(null, Array.from(arguments));
      try {
        return result.then(resolve, reject); // promise.
      } catch (e) {
        if (e instanceof TypeError) {
          resolve(result); // resolve naked value.
        } else {
          reject(e); // pass unhandled exception to caller.
        }
      }
    });
  };
};

const f = (x) => x;
const g = (x) => Promise.resolve(x);
const h = (x) => Promise.reject(x);

// Naked value.
toPromise(f)(1).then((x) => {console.log(x)});
// Resolved Promise.
toPromise(g)(2).then((x) => {console.log(x)});
// Rejected Promise.
toPromise(h)(3).catch((x) => {console.log(x)});
&#13;
&#13;
&#13;