说我有两个功能:
function f1() {
return new Promise<any>((resolve, reject) => {
resolve(true);
});
}
function f2() {
}
我如何知道f1
是否会返回Promise
而f2
不会?
答案 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或值数组并处理它。就像您需要知道f1
和f2
返回值或值的承诺一样。
底线:您需要具备函数返回的基本知识,以便能够通过正确的函数运行结果来解析承诺。
答案 2 :(得分:0)
这无法完成。
但是,您可以将任何函数强制转换为Promise返回函数。这就是我在这里所做的。
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;