无论是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。
其他回答
ES6:
const promise = new Promise(resolve => resolve('olá'));
console.log(promise.toString().includes('Promise')); //true
承诺库如何决定
如果它有一个.then函数——这是库使用的唯一标准承诺。
Promises/A+规范有一个叫做thenable的概念,它基本上是“带有then方法的对象”。承诺会而且应该用一种正确的方法来吸收任何东西。所有你提到的承诺实现都是这样做的。
如果我们看一下说明书:
2.3.3.3如果then是一个函数,用x像这样调用它,第一个参数resolvePromise,第二个参数rejectPromise
它还解释了这个设计决策的基本原理:
这种对thenabling的处理允许promise实现互操作,只要它们公开一个与Promises/ a +-兼容的then方法。它还允许Promises/A+实现用合理的then方法“同化”不符合规范的实现。
你应该如何决定
你不应该——而是调用promise. resolve(x) (Q(x) in Q),它总是将任何值或外部thenable转换为可信承诺。这比自己进行这些检查更安全、更容易。
真的需要确定吗?
您总是可以在测试套件中运行它:D
这是graphql-js包检测承诺的方式:
function isPromise(value) {
return Boolean(value && typeof value.then === 'function');
}
Value是函数的返回值。我在我的项目中使用这段代码,到目前为止还没有问题。
任何为了避免比较而将可能同步的值推入Promise.resolve(value)的操作都会使代码变成原本可以避免的异步。有时候在那个阶段你不想要它。你想知道在微任务队列中的一些早期解决方案咬你之前的结果。?
一个人可以做喜欢的事;
var isPromise = x => Object(x).constructor === Promise;
我检查了一些我能想到的边缘情况,它似乎工作。
isPromise(undefined); // <- false
isPromise(null); // <- false
isPromise(0); // <- false
isPromise(""); // <- false
isPromise({}); // <- false
isPromise(setTimeout); // <- false
isPromise(Promise); // <- false
isPromise(new Promise((v,x) => setTimeout(v,1000,"whatever"))); // <- true
isPromise(fetch('http://example.com/movies.json')); // <- true
我还没有对任何非本地库进行检查,但现在有什么意义呢?
if (typeof thing?.then === 'function') {
// probably a promise
} else {
// definitely not a promise
}