오브젝트가 Promise인지 확인하는 방법
ES6 it 。Promise
Bluebird ★★★★★★★★★★★★★★★★★★★★」Promise
Q , 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
이데올로기 때문에이러한 검사를 직접 수행하는 것보다 안전하고 쉽습니다.
정말 확신해야 하나요?
있는지 요.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 약속에서만 안정적으로 동작할 수 있습니다.
같은 '이 더 수 ..then
method
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'
할 가능성이 있는 것을 의 것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
나는 어떤 비원어민 도서관들과도 대조해 본 적이 없지만, 이제 와서 무슨 소용이 있겠는가?
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
'programing' 카테고리의 다른 글
MySQL "외부 키 제약 조건이 완전히 형성되었습니다" (0) | 2022.10.03 |
---|---|
MariaDB가 지원할 수 있는 최대 레코드 수 (0) | 2022.10.03 |
명령줄에서 mysql 원격 데이터베이스 액세스 (0) | 2022.10.03 |
스토어 변경 시 구성 요소가 업데이트되지 않음 - Vuex (0) | 2022.10.03 |
여러 열의 테이블 열 데이터 유형을 변경하려면 어떻게 해야 합니까? (0) | 2022.10.03 |