无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
当前回答
检查是否有不必要的承诺会使代码变得复杂,只需使用promise .resolve
Promise.resolve(valueOrPromiseItDoesntMatter).then(function(value) {
})
其他回答
if (typeof thing?.then === 'function') {
// probably a promise
} else {
// definitely not a promise
}
it('should return a promise', function() {
var result = testedFunctionThatReturnsPromise();
expect(result).toBeDefined();
// 3 slightly different ways of verifying a promise
expect(typeof result.then).toBe('function');
expect(result instanceof Promise).toBe(true);
expect(result).toBe(Promise.resolve(result));
});
如果你正在使用Typescript,我想补充一点,你可以使用“类型谓词”功能。只应该将逻辑验证包装在返回x is Promise<any>的函数中,您不需要进行类型转换。在下面的示例中,c要么是一个promise,要么是我想通过调用c.fetch()方法将其转换为promise的类型之一。
export function toPromise(c: Container<any> | Promise<any>): Promise<any> {
if (c == null) return Promise.resolve();
return isContainer(c) ? c.fetch() : c;
}
export function isContainer(val: Container<any> | Promise<any>): val is Container<any> {
return val && (<Container<any>>val).fetch !== undefined;
}
export function isPromise(val: Container<any> | Promise<any>): val is Promise<any> {
return val && (<Promise<any>>val).then !== undefined;
}
更多信息:https://www.typescriptlang.org/docs/handbook/advanced-types.html
免责声明:对更新OP不是一个很好的答案,只适用于本机,不能跨领域。而是遵循公认的答案。
obj instanceof Promise
应该这么做。请注意,这可能只与本地es6承诺可靠地工作。
如果您正在使用一个shim、一个promise库或任何假装类似promise的东西,那么可能更适合测试“thenable”(任何带有.then方法的东西),如这里的其他答案所示。
这是graphql-js包检测承诺的方式:
function isPromise(value) {
return Boolean(value && typeof value.then === 'function');
}
Value是函数的返回值。我在我的项目中使用这段代码,到目前为止还没有问题。