Javascript 确定参数是类(承诺实现)还是可调用函数

Javascript 确定参数是类(承诺实现)还是可调用函数,javascript,promise,Javascript,Promise,我有一个函数,它需要一个函数或一个类的一个参数,我必须对这两个参数分别执行不同的操作 伪代码示例: function myFunction(callback) { if ( /* callback is a Promise class */ ) { return new callback(function (resolve, reject) { // logic resolve(); }); } el

我有一个函数,它需要一个函数或一个类的一个参数,我必须对这两个参数分别执行不同的操作

伪代码示例:

function myFunction(callback) {
    if ( /* callback is a Promise class */ ) {
        return new callback(function (resolve, reject) {
            // logic
            resolve();
        });
    } else if ( /* callback is a callable function */ ) {
        // logic
        callback(); // Realistically this would not be called at the end of logic block.
    } else {
        // throw error
    }
}
我想为实现A+标准的任意承诺库提供支持,这样开发人员就可以通过他们已经在使用的任何实现,而不必执行任何变通方法或使用我的实现。请记住,我所说的不仅仅是现代虚拟机中的本机实现,我还将其作为目标。如果开发人员不(希望)使用Promise库,则可调用函数选项是一个备用选项。我希望这个解释有一定道理


从我尝试的结果来看,类和可调用函数总是得到相同的结果,因为JavaScript中的类只是函数。我能做的唯一变通办法是检查callback.length,但是这个功能非常脆弱,在任何实际的用例中都很可能中断

任意回调函数和构造函数之间实际上没有任何区别

ES6将在这里添加一些区别(例如,不为箭头函数提供
.prototype
属性),但这些都不可靠

构造函数和“正常”函数之间唯一真正的区别是它们的原型。如果您专门针对Promise实现,那么所有严肃的库都将有一个
.then()
方法

所以你可以用

if (typeof callback == "function")
    if (callback.prototype && typeof callback.prototype.then == "function")
        // looks like a Promise constructor
    else
        // an ordinary function
当然,这并不适用于100%可以想象的情况。可能还有其他类使用
then
方法,并且有一些承诺/A+一致性实现使
.then()
成为实例而不是原型方法。也不要忘记,
Promise
构造函数还没有标准化(它在ES6中,但在Promises/A+中没有)


比使用
Promise
构造函数模式更好的方法是
Promise.resolve
。您只需构造一个任意的thenable,然后它就会被每个promise实现所同化。甚至不需要将解析器作为参数提供给您,您只需在没有回调函数参数的情况下返回thenable即可。然后,您的消费者可以将对您的所有调用封装在他们最喜欢的库的
Promise.resolve(…)


Promise interoperability最初就是这样设计的,所以它绝对可以工作。

任意回调函数和构造函数之间实际上没有任何区别

ES6将在这里添加一些区别(例如,不为箭头函数提供
.prototype
属性),但这些都不可靠

构造函数和“正常”函数之间唯一真正的区别是它们的原型。如果您专门针对Promise实现,那么所有严肃的库都将有一个
.then()
方法

所以你可以用

if (typeof callback == "function")
    if (callback.prototype && typeof callback.prototype.then == "function")
        // looks like a Promise constructor
    else
        // an ordinary function
当然,这并不适用于100%可以想象的情况。可能还有其他类使用
then
方法,并且有一些承诺/A+一致性实现使
.then()
成为实例而不是原型方法。也不要忘记,
Promise
构造函数还没有标准化(它在ES6中,但在Promises/A+中没有)


比使用
Promise
构造函数模式更好的方法是
Promise.resolve
。您只需构造一个任意的thenable,然后它就会被每个promise实现所同化。甚至不需要将解析器作为参数提供给您,您只需在没有回调函数参数的情况下返回thenable即可。然后,您的消费者可以将对您的所有调用封装在他们最喜欢的库的
Promise.resolve(…)


Promise interoperability最初就是这样设计的,所以它绝对可以工作。

任意回调函数和构造函数之间实际上没有任何区别

ES6将在这里添加一些区别(例如,不为箭头函数提供
.prototype
属性),但这些都不可靠

构造函数和“正常”函数之间唯一真正的区别是它们的原型。如果您专门针对Promise实现,那么所有严肃的库都将有一个
.then()
方法

所以你可以用

if (typeof callback == "function")
    if (callback.prototype && typeof callback.prototype.then == "function")
        // looks like a Promise constructor
    else
        // an ordinary function
当然,这并不适用于100%可以想象的情况。可能还有其他类使用
then
方法,并且有一些承诺/A+一致性实现使
.then()
成为实例而不是原型方法。也不要忘记,
Promise
构造函数还没有标准化(它在ES6中,但在Promises/A+中没有)


比使用
Promise
构造函数模式更好的方法是
Promise.resolve
。您只需构造一个任意的thenable,然后它就会被每个promise实现所同化。甚至不需要将解析器作为参数提供给您,您只需在没有回调函数参数的情况下返回thenable即可。然后,您的消费者可以将对您的所有调用封装在他们最喜欢的库的
Promise.resolve(…)


Promise interoperability最初就是这样设计的,所以它绝对可以工作。

任意回调函数和构造函数之间实际上没有任何区别

ES6将在这里添加一些区别(例如,不为箭头函数提供
.prototype
属性),但这些都不可靠

构造函数和“正常”函数之间唯一真正的区别是它们的原型。如果您专门针对Promise实现,那么所有严肃的库都将有一个
.then()
方法