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()
方法