无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
当前回答
const isPromise = (value) => {
return !!(
value &&
value.then &&
typeof value.then === 'function' &&
value?.constructor?.name === 'Promise'
)
}
对我来说,这张支票更好,试试吧
其他回答
如果你在一个异步方法中,你可以这样做,避免任何歧义。
async myMethod(promiseOrNot){
const theValue = await promiseOrNot()
}
如果函数返回promise,它将等待并返回已解析的值。如果函数返回一个值,它将被视为已解析。
如果函数今天没有返回一个承诺,但明天返回一个承诺,或者被声明为异步,那么你将是不受未来影响的。
const isPromise = (value) => {
return !!(
value &&
value.then &&
typeof value.then === 'function' &&
value?.constructor?.name === 'Promise'
)
}
对我来说,这张支票更好,试试吧
使用这个库
https://www.npmjs.com/package/is-promise
import isPromise from 'is-promise';
isPromise(Promise.resolve());//=>true
isPromise({then:function () {...}});//=>true
isPromise(null);//=>false
isPromise({});//=>false
isPromise({then: true})//=>false
免责声明:对更新OP不是一个很好的答案,只适用于本机,不能跨领域。而是遵循公认的答案。
obj instanceof Promise
应该这么做。请注意,这可能只与本地es6承诺可靠地工作。
如果您正在使用一个shim、一个promise库或任何假装类似promise的东西,那么可能更适合测试“thenable”(任何带有.then方法的东西),如这里的其他答案所示。
在寻找一个可靠的方法来检测Async函数甚至承诺后,我最终使用了以下测试:
() => fn.constructor.name === 'Promise' || fn.constructor.name === 'AsyncFunction'