2017-02-08 1 views
10

Promise 다음 내가 가진 가정 :약속의 본문은 언제 실행됩니까?

function doSomethingAsynchronous() { 
    return new Promise((resolve) => { 
    const result = doSomeWork(); 

    setTimeout(() => { 
     resolve(result); 
    }), 100); 
    }); 
} 

시간의 어느 시점에서 doSomeWork()라고? 바로 뒤에 또는 Promise이 구성되어 있습니까? 그렇지 않은 경우 Promise의 본문이 실행되도록 명시 적으로 수행해야하는 추가 작업이 있습니까?

+2

[ECMAScript, 25.4.3.1'Promise (executor)'] (http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor) -> 9 단계 – Andreas

+0

그것은 ' 문제 : 운영 명령을 집행해야하는 경우 명시 적으로 그렇게하십시오. 구현마다 약간의 차이가있는 약속을 처리합니다 (예 : bluebird vs native map). – ssube

+0

달성하려는 목표는 무엇입니까? – guest271314

답변

12

즉시, 예, 사양별로. the MDN 가입일

:

실행 프로그램 기능은 의지를 전달 약속 구현 즉시 실행 및 기능 (약속 생성자에서도 생성 된 객체를 리턴하기 전에 실행 프로그램이라고 함)

거부되고 여기 ECMAScript 사양에 있습니다 (물론 읽기가 더 어려워 ...) : http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor

이 보증은 중요합니다. 예를 들어 그 다음에 all 또는 race으로 전달하거나 집행자가 동기식 부작용이있는 경우 몇 가지 약속을합니다.

+1

_Immediately_은 혼란 스럽습니다. executor는 Promise 생성자에 의해 ** 동 기적으로 ** ** 호출됩니다. – Paleo

1

예. Promise를 구성하면 첫 번째 매개 변수가 즉시 실행됩니다.

일반적으로 현재 구현에서와 같이 약속을 실제로 사용하지 않는 것이 동기식입니다.

당신은 오히려 타임 아웃을 구현하거나에서는 setTimeout 메서드는 그 다음 가능한 한 순간에 함수를 호출 할

function doSomethingAsynchronous() { 
    return new Promise((resolve) => { 
    setTimeout(function() { 
     const result = doSomeWork(); 
     resolve(result); 
    }, 0); 
    }); 
} 

아약스 콜백의 일부로 해결 함수를 호출 할 이벤트 큐 무료

-1

예. 통화가 동기식이므로 ".then"또는 ".catch"를 첨부하기 전에 즉시 호출됩니다.

약속은 이미 첫 번째 ".then"가 첨부 될 때까지 해결되며 즉시 해결 값을 전달합니다.

+0

본문이 동기식인지 비동기식이 문제가되지 않습니다. 약속 생성자는 동작을 알지 못하며 변경하지 않습니다. – ssube

+0

예.하지만 doSomeWork()가 콜백이면 즉시 호출되지 않습니다. – epiqueras

관련 문제