无论是ES6承诺还是蓝鸟承诺,Q承诺等等。

我如何测试,看看一个给定的对象是一个承诺?


当前回答

如果你在一个异步方法中,你可以这样做,避免任何歧义。

async myMethod(promiseOrNot){
  const theValue = await promiseOrNot()
}

如果函数返回promise,它将等待并返回已解析的值。如果函数返回一个值,它将被视为已解析。

如果函数今天没有返回一个承诺,但明天返回一个承诺,或者被声明为异步,那么你将是不受未来影响的。

其他回答

承诺库如何决定

如果它有一个.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是函数的返回值。我在我的项目中使用这段代码,到目前为止还没有问题。

if (typeof thing?.then === 'function') {
    // probably a promise
} else {
    // definitely not a promise
}

角:

import { isPromise } from '@angular/compiler/src/util';

if (isPromise(variable)) {
  // do something
}

J

在寻找一个可靠的方法来检测Async函数甚至承诺后,我最终使用了以下测试:

() => fn.constructor.name === 'Promise' || fn.constructor.name === 'AsyncFunction'