programing

오브젝트가 Promise인지 확인하는 방법

randomtip 2022. 10. 3. 21:15
반응형

오브젝트가 Promise인지 확인하는 방법

ES6 it 。Promise Bluebird ★★★★★★★★★★★★★★★★★★★★」PromiseQ , qPromise 등등.

지정된 객체가 다음 중 하나인지 여부를 테스트하려면 어떻게 해야 합니까?Promise

약속 라이브러리의 결정 방법

「」가 있는 .then기능 - 라이브러리가 사용하는 유일한 표준 약속입니다.

Promise에는 Promise/A+라고 하는 .then 능력은 기본적으로 이 있는 입니다.then메서드」를 참조해 주세요.약속은 어떤 것이든 그때의 방법과 동화시킬 것이고 또 그래야 한다.말씀하신 모든 약속 이행은 다음과 같습니다.

사양을 살펴보면 다음과 같습니다.

의 경우then를 사용하여 첫 번째 인수 Promise 및 두 인수 Promise.x 는 함수입니다.약속 해결 약속 거부

또, 이 설계 결정의 근거에 대해서도 설명합니다.

는 ★★★★★★★★의then/A+ ables, Promise/A+ 준거 ables, Promise/A+ ables, Promise의 실장이 되어 있는 한할 수 .then한 방법으로 부적합 구현을"수 있습니다.또한 Promise/A+ 구현은 합당한 방법으로 부적합 구현을 "평가"할 수 있습니다.

결정 방법

.- 전화는 안 돼요.- 전화는 안 돼요.Promise.resolve(x) )Q(x)Q)는 모든 값 또는 외부 값을 항상 변환합니다.then이데올로기 때문에이러한 검사를 직접 수행하는 것보다 안전하고 쉽습니다.

정말 확신해야 하나요?

테스트 스위트에서는 언제든지 실행할 수 있습니다.d

있는지 요.Promise.resolve

Promise.resolve(valueOrPromiseItDoesntMatter).then(function(value) {

})

면책사항: 갱신된 OP에 대한 적절한 답변이 아닙니다.라이브러리마다 다르며 영역 간에는 적용되지 않습니다..then★★★★★★ 。

답변은 스펙에 근거한 으로, 때때로 효과가 있는 약속을 테스트하는 방법입니다.참고하세요.

Promise.resolve(obj) == obj &&
BLUEBIRD.resolve(obj) == obj

이것이 동작하는 것은 알고리즘이 명시적으로 요구하기 때문입니다.Promise.resolve는 전달된 오브젝트가 이 컨스트럭터에 의해 작성된 약속경우에만 정확한 오브젝트를 반환해야 합니다.

면책사항: 갱신된 OP에 대한 적절한 답변이 아닙니다.원어민만을 대상으로 하며 영역 전체에서 사용할 수 없습니다.대신 승인된 답변을 따르세요.

obj instanceof Promise

할 수 있을 거예요.이는 네이티브 es6 약속에서만 안정적으로 동작할 수 있습니다.

같은 '이 더 수 ..thenmethod

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

지정된 객체가 ES6 Promise인지 확인하려면 다음 용어를 사용합니다.

function isPromise(p) {
  return p && Object.prototype.toString.call(p) === "[object Promise]";
}

Call입력toString에서 직접Object.prototype지정된 오브젝트 유형의 네이티브 문자열 표현을 반환합니다."[object Promise]"저희 같은 경우에는요.이를 통해 지정된 오브젝트가

  • 다음과 같은 false positive를 바이패스합니다.:
    • 동일한 생성자 이름("Promise")을 가진 자체 정의 개체 유형입니다.
    • 자필toString지정된 객체의 메서드.
  • 또는 와는 대조적으로 여러 환경 컨텍스트(iframe 등)에서 동작합니다.isPrototypeOf.

단, 를 통해 태그가 변경된 특정 호스트 오브젝트는 반환할 수 있습니다."[object Promise]"이것은 프로젝트에 따라서는 의도한 결과일 수도 있고 그렇지 않을 수도 있습니다(예를 들어 커스텀 프로미스 구현이 있는 경우).


오브젝트가 네이티브 ES6 Promise 제품인지 확인하려면 다음을 사용합니다.

function isNativePromise(p) {
  return p && typeof p.constructor === "function"
    && Function.prototype.toString.call(p.constructor).replace(/\(.*\)/, "()")
    === Function.prototype.toString.call(/*native object*/Function)
      .replace("Function", "Promise") // replacing Identifier
      .replace(/\(.*\)/, "()"); // removing possible FormalParameterList 
}

스펙의 이 섹션 섹션에 따르면 함수의 문자열 표현은 다음과 같습니다.

"함수 식별자( Formalopt Parameter List ) { Function Body }"

위에서 적절하게 처리됩니다.Function Body는[native code]모든 주요 브라우저에서 사용할 수 있습니다.

MDN:Function.prototype.toString

이것은, 복수의 환경 콘텍스트에서도 기능합니다.

graphql-js 패키지는 다음과 같이 약속을 검출합니다.

function isPromise(value) {
  return Boolean(value && typeof value.then === 'function');
}

value함수의 반환값입니다.저는 이 코드를 프로젝트에 사용하고 있으며, 지금까지는 문제가 없습니다.

완전한 질문에 대한 답변은 아니지만 Node.js 10에 오브젝트가 네이티브 Promise인지 아닌지를 체크하는 새로운 util 함수가 추가되었음을 언급할 필요가 있다고 생각합니다.

const utilTypes = require('util').types
const b_Promise = require('bluebird')

utilTypes.isPromise(Promise.resolve(5)) // true
utilTypes.isPromise(b_Promise.resolve(5)) // false

비동기 방식일 경우 이를 통해 애매모호함을 피할 수 있습니다.

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

함수가 약속을 반환할 경우 해당 함수는 대기하고 해결된 값으로 반환됩니다.함수가 값을 반환하면 해결된 것으로 간주됩니다.

함수가 오늘 약속을 반환하지 않고 내일 약속을 반환하거나 비동기라고 선언되면 미래에 대비할 수 있습니다.

다음은 코드폼 https://github.com/ssnau/xkit/blob/master/util/is-promise.js 입니다.

!!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';

" " " 가 붙은 then은 방, ,, 은, a, 급, 급, 되, 되, 되, 되, 되, 되, method, method, method, method, methodPromise.

Typescript 를 사용하고 있는 경우는, 「type 술어」기능을 사용할 수 있는 것을 추가하고 싶습니다.논리 검증을 반환하는 함수로 정리하면 됩니다.x is Promise<any>타이프캐스트를 할 필요가 없습니다.제 예시는 다음과 같습니다.c는 약속 내 중 이며, 이 타입을 하려면 , 「약속」을 하면 됩니다.」c.fetch()★★★★★★ 。

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

비동기 함수 또는 Promise검출하는 신뢰성 높은 방법을 검색한 후 다음 테스트를 사용하게 되었습니다.

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

할 가능성이 있는 것을 의 것valuePromise.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

나는 어떤 비원어민 도서관들과도 대조해 본 적이 없지만, 이제 와서 무슨 소용이 있겠는가?

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));
});

이 기능을 범용 솔루션으로 사용합니다.

function isPromise(value) {
  return value && value.then && typeof value.then === 'function';
}
const isPromise = (value) => {
  return !!(
    value &&
    value.then &&
    typeof value.then === 'function' &&
    value?.constructor?.name === 'Promise'
  )
}

저는 이 수표가 더 좋아요, 한번 써보세요.

각도:

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

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

J

이 라이브러리를 사용하다

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

ES6:

const promise = new Promise(resolve => resolve('olá'));

console.log(promise.toString().includes('Promise')); //true

언급URL : https://stackoverflow.com/questions/27746304/how-to-check-if-an-object-is-a-promise

반응형