Javascript 函数包装承诺获取未定义的typeof then

Javascript 函数包装承诺获取未定义的typeof then,javascript,promise,Javascript,Promise,我将一个fn作为参数传递给树遍历函数中的每个节点。我试图通过使用typeof fn来检查fn是否是一个承诺。然后==='function'(如果是,我将需要使用所示的“有希望的”遍历版本)。作为fn的定义,如果我将一个新的承诺包装到一个函数中以接受节点参数,那么上面的检查将返回未定义的,而不是函数 <script> let promise1 = new Promise((resolve, reject) => { let y = 2; resolve(y); });

我将一个
fn
作为参数传递给树遍历函数中的每个节点。我试图通过使用
typeof fn来检查
fn
是否是一个承诺。然后==='function'
(如果是,我将需要使用所示的“有希望的”遍历版本)。作为
fn
的定义,如果我将一个新的承诺包装到一个函数中以接受
节点
参数,那么上面的检查将返回
未定义的
,而不是
函数

<script>
let promise1 = new Promise((resolve, reject) => {
    let y = 2;
  resolve(y);
});

let promise2 = function(y){
  return new Promise((resolve, reject) => {
    resolve(y);
  });
};

alert ('typeof promise1.then: ' + typeof promise1.then + '\ntypeof promise2.then: '  + typeof promise2.then);
</script>

让承诺人1=新的承诺((决定,拒绝)=>{
设y=2;
决议(y);
});
let promise2=功能(y){
返回新承诺((解决、拒绝)=>{
决议(y);
});
};
警报('typeofpromise1.then:'+typeofpromise1.then+'\nTypeofpromise2.then:'+typeofpromise2.then);
我试图检查某件事是否是一个承诺;如果是,我将需要使用一个“有希望”的遍历版本

不要那样做。从同一个函数返回不同的类型(result vs promise for result)是非常令人困惑的,在函数内部动态地在“正常”和“有希望”版本之间切换也不会使代码更易于维护


只需提供两个不同的函数,一个是同步函数,它期望回调函数返回纯值,另一个是异步函数,它期望回调函数返回承诺。在这里,您只需使用
promise.resolve(…)
将任何返回值强制转换为一个承诺,而不是测试它是否是一个承诺(或类似的东西)。

“Demo code is here”应该是一个,而不是指向外部承诺的链接resource@Andreas--通常我使用plunker作为演示代码,我看到其他人也这样做。演示代码本身是完整的和可验证的,如果您可以简单地看一下。我不知道为什么我在发帖后5秒内得到了一个“-1”;我觉得你很不负责任。当然你需要检查函数的返回值是否是承诺,而不是检查函数是否是承诺。我认为你必须调用函数,看看返回值是什么。希望函数不可能有时返回承诺,有时返回其他内容。避免使用可能返回承诺的函数或反过来返回承诺的函数。为了可读性,您应该始终返回一种类型。例如,您可以将承诺(否则将直接返回)包装到函数中。您能否提供一个更详细(但尽可能简短)的示例,说明如何调用这样的函数?除了使用
foo instanceof promise
promise.resolve(…)
更好地探索承诺之外,似乎是一个实用的解决方案,可以包装
fn
“它是否是一个承诺(或类似的东西)”,并生成一个可执行的。是的,这正是
promise.resolve
:-)