the*_*ram 294 javascript promise q bluebird es6-promise
无论是ES6 Promise还是蓝鸟Promise,Q Promise等.
如何测试以查看给定对象是否为Promise?
Ben*_*aum 305
如果它有一个.then功能 - 这是图书馆使用的唯一标准承诺.
Promises/A +规范有一个名为thenable 的概念,它基本上是"带有then方法的对象".承诺将并且应该用当时的方法吸收任何东西.你提到的所有承诺实现都是这样做的.
如果我们看一下规范:
2.3.3.3 if
then是一个函数,用x调用它,第一个参数是resolvePromise,第二个参数是rejectPromise
它还解释了此设计决策的基本原理:
这种对
thenables的处理允许promise实现进行互操作,只要它们公开Promise/A +兼容then方法即可.它还允许Promises/A +实现使用合理的方法"同化"不一致的实现.
你不应该 - 而是调用Promise.resolve(x)(Q(x)在Q中)将始终将任何值或外部then能力转换为受信任的承诺.它比自己执行这些检查更安全,更容易.
您始终可以通过测试套件运行它:D
Esa*_*ija 155
检查某些东西是否有必要使代码变得复杂,只需使用即可 Promise.resolve
Promise.resolve(valueOrPromiseItDoesntMatter).then(function(value) {
})
Run Code Online (Sandbox Code Playgroud)
jib*_*jib 87
Promise.resolve(obj) == obj
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为算法明确要求Promise.resolve必须返回传入的确切对象,当且仅当它是规范定义的承诺时.
我在这里有另一个答案,过去曾经说过这个,但当时它与Safari无法合作时,我将其更改为其他内容.那是一年前的事,即使在Safari中也能正常运行.
我会编辑我的原始答案,除非感觉不对,因为现在有更多人投票支持该答案中的改变解决方案而不是原始答案.我相信这是更好的答案,我希望你同意.
jib*_*jib 51
更新:这不再是最好的答案.请改为投票给我的其他答案.
obj instanceof Promise
Run Code Online (Sandbox Code Playgroud)
应该这样做.请注意,这可能仅适用于本机es6承诺.
如果您正在使用垫片,承诺库或任何其他假装类似承诺的东西,那么测试"可以"(使用.then方法的任何东西)可能更合适,如此处的其他答案所示.
uno*_*obf 42
if (typeof thing.then === 'function') {
// probably a promise
} else {
// definitely not a promise
}
Run Code Online (Sandbox Code Playgroud)
Bog*_*ann 15
要查看给定对象是否是本机ES6 Promise,我们可以使用此谓词:
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Run Code Online (Sandbox Code Playgroud)
Call荷兰国际集团toString直接从Object.prototype返回一个原生字符串表示,其是给定对象类型的"[object Promise]"在我们的例子.这确保了给定的对象
toString给定对象的自编方法.instanceof或相反,跨多个环境上下文(例如iframe)工作isPrototypeOf.并非完整问题的答案,但我认为值得一提的是,在Node.js 10 isPromise中添加了一个名为util的新util函数,该函数可检查对象是否为本地Promise:
const utilTypes = require('util').types
const b_Promise = require('bluebird')
utilTypes.isPromise(Promise.resolve(5)) // true
utilTypes.isPromise(b_Promise.resolve(5)) // false
Run Code Online (Sandbox Code Playgroud)
小智 6
这是代码表https://github.com/ssnau/xkit/blob/master/util/is-promise.js
!!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
Run Code Online (Sandbox Code Playgroud)
如果一个对象有一个then方法,它应该被视为一个Promise.
如果您使用的是异步方法,则可以这样做并避免任何歧义。
async myMethod(promiseOrNot){
const theValue = await promiseOrNot()
}
Run Code Online (Sandbox Code Playgroud)
如果函数返回promise,它将等待并返回已解析的值。如果该函数返回一个值,它将被视为已解析。
如果该函数今天没有返回承诺,但是明天返回了一个承诺或被声明为异步,那么您将可以保证未来的发展。
如果您使用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;
}
Run Code Online (Sandbox Code Playgroud)
更多信息:https : //www.typescriptlang.org/docs/handbook/advanced-types.html
这是graphql-js包检测promise的方式:
function isPromise(value) {
return Boolean(value && typeof value.then === 'function');
}
Run Code Online (Sandbox Code Playgroud)
value是函数的返回值。我正在项目中使用此代码,到目前为止没有问题。
为了避免比较而将可能的同步value推入其中的任何操作都会将您的代码变成本来可以避免的异步。Promise.resolve(value)有时您在那个阶段并不想要它。您想知道在微任务队列中的某些早期解决方案咬住您之前评估的结果吗?
一个人可能会这样做;
var isPromise = x => Object(x).constructor === Promise;
Run Code Online (Sandbox Code Playgroud)
我根据我能想到的一些边缘情况检查了它,它似乎有效。
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
Run Code Online (Sandbox Code Playgroud)
我还没有与任何非本地库进行过检查,但现在有什么意义呢?
| 归档时间: |
|
| 查看次数: |
115178 次 |
| 最近记录: |