无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
无论是ES6承诺还是蓝鸟承诺,Q承诺等等。
我如何测试,看看一个给定的对象是一个承诺?
当前回答
这是https://github.com/ssnau/xkit/blob/master/util/is-promise.js的代码
!!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
如果一个对象具有then方法,它应该被视为Promise。
其他回答
这是graphql-js包检测承诺的方式:
function isPromise(value) {
return Boolean(value && typeof value.then === 'function');
}
Value是函数的返回值。我在我的项目中使用这段代码,到目前为止还没有问题。
这是https://github.com/ssnau/xkit/blob/master/util/is-promise.js的代码
!!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
如果一个对象具有then方法,它应该被视为Promise。
免责声明:对更新OP不是一个很好的答案,只适用于本机,不能跨领域。而是遵循公认的答案。
obj instanceof Promise
应该这么做。请注意,这可能只与本地es6承诺可靠地工作。
如果您正在使用一个shim、一个promise库或任何假装类似promise的东西,那么可能更适合测试“thenable”(任何带有.then方法的东西),如这里的其他答案所示。
免责声明:更新OP不是一个很好的答案,是每个库,不会跨领域工作。改为检查。then。
这个基于规范的答案是一种测试承诺的方法,仅供参考。
Promise.resolve(obj) == obj &&
BLUEBIRD.resolve(obj) == obj
当它起作用时,是因为算法明确地要求Promise。当且仅当它是此构造函数创建的promise时,Resolve必须返回传入的确切对象。
使用这个库
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