假设我有两个函数:
function f1() {
return new Promise<any>((resolve, reject) => {
resolve(true);
});
}
function f2() {
}
我该如何知道f1
是否会返回Promise
而f2
不会呢?
假设我有两个函数:
function f1() {
return new Promise<any>((resolve, reject) => {
resolve(true);
});
}
function f2() {
}
我该如何知道f1
是否会返回Promise
而f2
不会呢?
调用该函数,使用instanceof
let possiblePromise = f1();
let isPromise = possiblePromise instanceof Promise;
RegExp
。 - guest271314f1
没有返回一个 Promise
,函数的结果仍然可以传递给 Promise.resolve()
。 - guest271314所以这只是关于规范化输出的问题。然后通过Promise.resolve()
等方法运行它。
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
返回一个Promise数组或值并进行处理。就像您需要知道f1
和f2
返回一个值或值的Promise。
总之,您需要基本了解函数返回什么才能通过适当的函数运行结果来解决Promise。
这是不可能完成的。
然而,你可以将任何函数转换为返回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)});
function f3(){return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'}
- Kenan Banksconst c = (value) => value < pivot? a(value): b(value)
中c
是否返回一个Promise。特别是如果a
和b
是封闭变量,因此完全超出了您的控制范围。 - Thomasutil/types
中的isPromise
函数。文档链接在这里。
import { isPromise } from "util/types";
// assume the JS object you want to test is "obj"
isPromise(obj);
function f3(){return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'}
- Yury Tarabankolet isPromise = possiblePromise instanceof Promise ? possiblePromise : Promise.resolve(possiblePromise)
,参见http://stackoverflow.com/a/28123576/@tranminhtam - guest271314