Programing

자바 스크립트에서 이중 괄호의 의미와 액세스 방법

crosscheck 2020. 12. 30. 19:02
반응형

자바 스크립트에서 이중 괄호의 의미와 액세스 방법


상태

Promise 를 사용하는 다음 기능이 있습니다.

var getDefinitions = function() {
    return new Promise(function(resolve) {
        resolve(ContactManager.request("definition:entities"));
    });
}

var definitions = getDefinitions()

의 내용 definitions은 다음과 같습니다.

Promise {
    [[PromiseStatus]]: "resolved",
    [[PromiseValue]]: child
}

PromiseValue속성에 직접 액세스하면 undefined가 반환됩니다.

var value = definitions.PromiseValue; // undefined

질문

이중 대괄호 [[ ]]무엇을 의미하며 [[PromiseValue]].


안에 물건이 뭐야 [[]]

내 질문은 이중 대괄호 [[]]의 의미와 [[PromiseValue]]의 값을 검색하는 방법입니다.

내부 속성입니다. 직접 액세스 할 수 없습니다. 기본 약속은 then약속을 통해 또는 일반적으로 비동기 적으로 만 풀릴 수 있습니다 . 비동기 호출에서 응답을 반환하는 방법을 참조하십시오 . 사양 인용 :

그들은 순전히 설명 목적으로이 사양에 의해 정의됩니다. ECMAScript의 구현은 여기에 설명 된 방식으로 내부 속성을 생성하고 작동하는 것처럼 동작해야합니다. 내부 속성의 이름은 이중 대괄호 [[]]로 묶여 있습니다. 알고리즘이 객체의 내부 속성을 사용하고 객체가 표시된 내부 속성을 구현하지 않으면 TypeError 예외가 발생합니다.

당신은 할 수 없습니다

진지하게-그들은 무엇입니까?

아주 좋아요! 위의 인용문은 사양에서 사용 된 것이므로 콘솔에 실제로 표시 될 이유가 없습니다.

아무에게도 말하지 마십시오. 그러나 이것들은 정말로 사적인 상징 입니다. 그것들이 존재하는 이유는 다른 내부 메소드가 [[PromiseValue]]. 예를 들어 io.js가 콜백을받는 대신 프라 미스를 반환하기로 결정한 경우, 보장되는 경우 이러한 속성에 빠르게 액세스 할 수 있습니다. 그들은 외부에 노출 되지 않습니다 .

액세스 할 수 있습니까?

나만의 Chrome 또는 V8 빌드를 만들지 않는 한 아닙니다. 아마도 액세스 수정자가있는 ES7에서는 사양의 일부가 아니고 브라우저에서 깨질 방법이 없습니다. 죄송합니다.

그래서 나는 내 가치를 얻습니까?

getDefinitions().then(function(defs){
    //access them here
});

내가 추측해야하더라도- 이 변환은 메서드가 동기식 (이 경우 약속을 반환하지 않음) 인 경우에만 작동하거나 이미 만들 약속을 반환하기 때문에 API를 올바르게 변환하지 않습니다. 그것은 해결되었습니다 (즉, 변환이 전혀 필요하지 않음을 의미합니다 return.


나는 또한 오늘이 문제에 들어가 해결책을 찾았습니다.

내 솔루션은 다음과 같습니다.

fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
    // you can access your data here
    console.log(data)
})

여기서, dataWrappedByPromiseA는 Promise인스턴스. Promise인스턴스 의 데이터에 액세스하려면 메서드 를 사용하여 해당 인스턴스의 래핑해제 해야합니다 .json().

도움이 되었기를 바랍니다.


예제는 반응이 있지만 대부분 동일해야합니다.

교체 는 대부분의 다른 프레임 워크에 대해 작동하도록 가져 오기 위해 당신의 URL로 this.props.url을.

res.json ()을 구문 분석하면 [[promiseValue]]가 반환되지만 아래의 다른 .then () 메서드로 반환하면 전체 배열로 반환 할 수 있습니다.

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })

맨 페이지를 읽으면 다음 을 볼 수 있습니다.

설계 상 프라 미스의 인스턴트 상태와 값은 then()메서드 를 호출하지 않고 코드에서 동 기적으로 검사 할 수 없습니다 .

디버깅을 돕기 위해 promise 객체를 수동으로 검사 할 때만 코드에서 액세스 할 수없는 특수 속성으로 더 많은 정보를 볼 수 있습니다 (현재는 더 정교한 언어 또는 디버거 지원이 부족하여 속성 이름을 무작위로 지정하여 구현 됨). ).

Emphasis mine. Therefore, what you want to do cannot be done. The better question is why do you need to access the promise state like that?


Here is the way to access the PromiseValue (promise):

  let promises = definitions;

  Promise.all(promises).then((promise) => {
    console.log('promises = ', promises);

    console.log('promise = ', promise);
  });

Try using await.

Instead of

var value = definitions.PromiseValue 

use

var value =  await definiton;

This might solve your purpose by yielding the promise value.

Note that await can only be used inside async functions, and it is an ES2016 feature.


I think that it will go well with this.

(async () => {
  let getDefinitions = await ( () => {
    return new Promise( (resolve, reject) => {
      resolve(ContactManager.request("definition:entities"));
    });
  })();
)();

Small variation/extenstion to the solutions provided

For the case when the response returned is HTML, not a JSON

fetch('http://localhost:3000/hello')
  .then(response => response.text())
  .then(data => {
    // you can see your PromiseValue data here
    console.log(data)
  })

ReferenceURL : https://stackoverflow.com/questions/28916710/what-do-double-brackets-mean-in-javascript-and-how-to-access-them

반응형