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

如何检查JavaScript函数是否返回承诺?,javascript,function,promise,Javascript,Function,Promise,假设我有两个功能: function f1() { return new Promise<any>((resolve, reject) => { resolve(true); }); } function f2() { } 函数f1(){ 返回新承诺((解决、拒绝)=>{ 决心(正确); }); } 函数f2(){ } 如何知道f1是否会返回Promise而f2不会返回?调用函数,使用instanceof let possiblePromi

假设我有两个功能:

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

function f2() {
}
函数f1(){
返回新承诺((解决、拒绝)=>{
决心(正确);
});
}
函数f2(){
}

如何知道
f1
是否会返回
Promise
f2
不会返回?

调用函数,使用
instanceof

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

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

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

但是您需要对这些函数返回的内容有一个基本的了解。例如:两个例子都会失败

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
返回一个承诺或值数组并处理它。您需要知道
f1
f2
返回值或值的承诺

一句话:您需要对函数返回的内容有基本的了解,才能通过适当的函数运行结果来解决承诺。

这是不可能的

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

const toPromise=函数(f){
返回函数(){
返回新承诺((解决、拒绝)=>{
const result=f.apply(null,Array.from(参数));
试一试{
返回结果。然后(解析、拒绝);//承诺。
}捕获(e){
if(e instanceof TypeError){
解析(结果);//解析裸值。
}否则{
拒绝(e);//将未处理的异常传递给调用方。
}
}
});
};
};
常数f=(x)=>x;
常数g=(x)=>Promise.resolve(x);
常数h=(x)=>承诺.拒绝(x);
//赤裸裸的价值。
toPromise(f)(1).then((x)=>{console.log(x)});
//决心承诺。
toPromise(g)(2).then((x)=>{console.log(x)});
//拒绝承诺。

toPromise(h)(3).catch((x)=>{console.log(x)})你需要调用它,看看它返回了什么…首先你需要解决这个问题,看看它是否真的返回了。或者你可以调用它,看看会发生什么。我的意思是,如果我能有一个函数来检查f1是否是一个返回承诺的函数。ispromise函数(f1)//真ispromise函数(f2)//False,即使它确实返回了一个承诺,但不能保证下次它会返回函数f3(){return Math.random()>0.5?Promise.resolve(true):'naaah'}
ps:我不想调用它,只是检查任何函数是否返回了承诺not@AlonEitan然后,在这里,您可以尝试交替使用
RegExp
@AlonEitan,如果
f1
没有返回
Promise
函数的结果仍然可以传递给
Promise.resolve()
相信我,我完全理解你的答案,这是我一点也不理解的OP(顺便说一句,我没有投反对票,我实际上投了反对票-但我确实投了反对票,VTC认为“不清楚你在问什么”)这样,您就可以检查它是否是使用该承诺实现创建的承诺,尤其是,如果它是使用另一个承诺创建的,那么即使它返回了有效的承诺,它也将是错误的。此外,我认为OP要求知道函数是否在不执行承诺的情况下返回承诺(这是不可能的)。“这是不可能的。”
RegExp
可用于将函数解析为stringNo,这仍然不起作用。考虑OP注释中的例子:<代码>函数f3(){RealMax.Read()(0.5).Engest.解析(TRUE):'Naaa' } /代码> <代码> ReGeXP可以编译,虽然它可能不是微不足道的。“不能”意味着不可能,在可能的地方。不。没有可以猜测随机函数返回值的正则表达式。我想写一个可以预测未来的正则表达式会让人精疲力尽。
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);