programing

함수 내부에서 변수를 수정해도 변경되지 않는 이유는 무엇입니까? - 비동기 코드 참조

goodjava 2022. 12. 10. 10:49

함수 내부에서 변수를 수정해도 변경되지 않는 이유는 무엇입니까? - 비동기 코드 참조

다음 예시를 제시하면, 그 이유는 무엇입니까?outerScopeVar의되되? 츠요시

var outerScopeVar;

var img = document.createElement('img');
img.onload = function() {
    outerScopeVar = this.width;
};
img.src = 'lolcat.png';
alert(outerScopeVar);
var outerScopeVar;
setTimeout(function() {
    outerScopeVar = 'Hello Asynchronous World!';
}, 0);
alert(outerScopeVar);
// Example using some jQuery
var outerScopeVar;
$.post('loldog', function(response) {
    outerScopeVar = response;
});
alert(outerScopeVar);
// Node.js example
var outerScopeVar;
fs.readFile('./catdog.html', function(err, data) {
    outerScopeVar = data;
});
console.log(outerScopeVar);
// with promises
var outerScopeVar;
myPromise.then(function (response) {
    outerScopeVar = response;
});
console.log(outerScopeVar);
// with observables
var outerScopeVar;
myObservable.subscribe(function (value) {
    outerScopeVar = value;
});
console.log(outerScopeVar);
// geolocation API
var outerScopeVar;
navigator.geolocation.getCurrentPosition(function (pos) {
    outerScopeVar = pos;
});
console.log(outerScopeVar);

「」가 되는가.undefined이 모든 예에서요?회피책은 필요 없습니다.왜 이런 일이 일어나는지 알고 싶습니다.


주의: 이것은 JavaScript 비동기성에 대한 표준 질문입니다.자유롭게 이 질문을 개선하고 커뮤니티가 식별할 수 있는 더 간단한 예를 추가해 주십시오.

한마디로 비동기성입니다.

서문

이 항목은 Stack Overflow에서 몇 천 번 이상 반복되었습니다.따라서 먼저 매우 유용한 리소스를 몇 가지 짚고 넘어가겠습니다.


당면한 질문에 대한 답변

먼저 일반적인 행동을 추적해 봅시다.예에서, 「」는outerScopeVar함수의 내부에서 변경됩니다.이 함수는 분명히 즉시 실행되지 않습니다.인수로 할당 또는 전달되고 있습니다.이것이 우리가 콜백이라고 부르는 것입니다.

문제는 콜백이 언제 호출되느냐는 것입니다.

경우에 따라 다르죠.일반적인 동작을 다시 추적해 보겠습니다.

  • img.onload이미지가 정상적으로 로드되었을 때(및 로드되었을 경우)에 호출할 수 있습니다.
  • setTimeout에 의해 지연이 만료되고 타임아웃이 취소되지 않은 후 나중에 호출될 수 있습니다.clearTimeout:0지연으로서 모든 브라우저에는 최소 타임아웃 지연 상한(HTML5 사양에서는 4ms로 지정)이 있습니다.
  • j리 j$.postAjax 요구가 정상적으로 완료된 경우,의 콜백은 장래에 호출될 가능성이 있습니다.
  • Node.js의fs.readFile파일이 정상적으로 읽혔거나 에러가 발생했을 때, 장래에 호출될 가능성이 있습니다.

어느 경우든 콜백은 나중에 실행될 수 있습니다.이러한 "미래의 어떤 시점"을 비동기 흐름이라고 합니다.

비동기 실행은 동기 흐름에서 푸시됩니다.즉, 동기 코드 스택이 실행되는 동안에는 비동기 코드가 실행되지 않습니다.이것이 JavaScript가 싱글 스레드라는 의미입니다.

구체적으로는 (a)동기 코드 스택을 실행하지 않고 JS 엔진이 아이돌 상태일 경우 비동기 콜백을 트리거한 이벤트(예: 타임아웃 만료, 네트워크 응답 수신)를 폴링하여 차례로 실행합니다.이것은 이벤트 루프로 간주됩니다.

즉, 손으로 그린 빨간색 도형으로 강조 표시된 비동기 코드는 각각의 코드 블록에 남아 있는 모든 동기 코드가 실행된 후에만 실행될 수 있습니다.

비동기 코드가 강조 표시됨

즉, 콜백 함수는 동기적으로 생성되지만 비동기적으로 실행됩니다.비동기 함수가 실행되었음을 알 때까지 신뢰할 수 없습니다. 어떻게 실행합니까?

정말 간단해요.비동기 함수 실행에 의존하는 로직은 이 비동기 함수 내부에서 시작/호출해야 합니다.를 들어, 「」, 「」의 입니다.alert §console.log콜백 함수의 내부에서는, 그 시점에서 결과를 사용할 수 있기 때문에, 그 결과는 예상대로 출력됩니다.

독자적인 콜백 로직 구현

비동기 함수의 결과로 더 많은 작업을 수행하거나 비동기 함수가 호출된 위치에 따라 결과에 대해 다른 작업을 수행해야 하는 경우가 많습니다.조금 더 복잡한 예를 들어 보겠습니다.

var outerScopeVar;
helloCatAsync();
alert(outerScopeVar);

function helloCatAsync() {
    setTimeout(function() {
        outerScopeVar = 'Nya';
    }, Math.random() * 2000);
}

주의: 사용 중setTimeout함수로서 는, Ajax 에 됩니다.readFile,onload★★★★★★★★★★★★★★★★★★★★★★★★★★★

이 예에서는 다른 예와 같은 문제가 발생하고 있습니다.비동기 함수가 실행될 때까지 대기하지 않습니다.

독자적인 콜백 시스템을 도입하는 것에 임해 봅시다.그 , 리, first, first, 우, first, first, 거, 거, first, first, first, first.outerScopeVar이 경우에는 전혀 쓸모가 없습니다.그런 다음 함수 인수인 콜백을 받아들이는 파라미터를 추가합니다.비동기 조작이 종료되면 이 콜백을 호출하여 결과를 전달합니다.구현(코멘트를 순서대로 읽어주세요)

// 1. Call helloCatAsync passing a callback function,
//    which will be called receiving the result from the async operation
helloCatAsync(function(result) {
    // 5. Received the result from the async function,
    //    now do whatever you want with it:
    alert(result);
});

// 2. The "callback" parameter is a reference to the function which
//    was passed as argument from the helloCatAsync call
function helloCatAsync(callback) {
    // 3. Start async operation:
    setTimeout(function() {
        // 4. Finished async operation,
        //    call the callback passing the result as argument
        callback('Nya');
    }, Math.random() * 2000);
}

위 예의 코드 스니펫:

// 1. Call helloCatAsync passing a callback function,
//    which will be called receiving the result from the async operation
console.log("1. function called...")
helloCatAsync(function(result) {
    // 5. Received the result from the async function,
    //    now do whatever you want with it:
    console.log("5. result is: ", result);
});

// 2. The "callback" parameter is a reference to the function which
//    was passed as argument from the helloCatAsync call
function helloCatAsync(callback) {
    console.log("2. callback here is the function passed as argument above...")
    // 3. Start async operation:
    setTimeout(function() {
    console.log("3. start async operation...")
    console.log("4. finished async operation, calling the callback, passing the result...")
        // 4. Finished async operation,
        //    call the callback passing the result as argument
        callback('Nya');
    }, Math.random() * 2000);
}

DOM API)을.helloCatAsync이치노콜백 함수를 전달하고 동기 흐름에서 콜백이 실행된다는 것을 이해하고 그에 맞게 코드를 재구성하기만 하면 됩니다.

, 성질 에, 「」, 「」, 「」, 「」는 할 수 것을 알 수 .return비동기 콜백은 동기 코드 실행이 이미 끝난 후 장시간 실행되므로 비동기 흐름에서 콜백이 정의된 동기 흐름으로 되돌아가는 값입니다.

return비동기 콜백에서 값을 입력하려면 콜백 패턴을 사용해야 합니다.또는...★★★★★★★★★★★★★★★★★★.

약속들

Vanilla JS를 통해 콜백 지옥을 막을 수 있는 방법이 있지만, 약속은 점점 더 인기를 얻고 있으며 현재 ES6에서 표준화되고 있습니다(Promise - MDN 참조).

약속(일명.k.a)Futures)는 비동기 코드의 보다 선형적이고 쾌적한 판독을 제공하지만, 비동기 코드의 기능 전체를 설명하는 것은 이 질문의 범위 밖입니다.대신, 다음과 같은 우수한 리소스를 관심 있는 분들을 위해 남겨두겠습니다.


JavaScript 비동기성에 대한 추가 자료

  • Art of Node - Callbacks는 비동기 코드와 콜백을 바닐라 JS의 예와 Node.js 코드로 잘 설명하고 있습니다.

주의: 이 답변은 커뮤니티 Wiki로 표시되었으므로 100명 이상의 평판을 가진 사람은 누구나 편집 및 개선할 수 있습니다.이 답변을 개선하거나 완전히 새로운 답변을 제출해 주십시오.

이 질문을 Ajax와 무관한 비동기성 문제에 답하기 위한 표준 토픽으로 전환하고 싶습니다(AJAX 호출에서 응답을 반환하는 방법이 있습니까?).그렇기 때문에 이 토픽은 가능한 한 유용하고 도움이 필요합니다.

Fabricio의 답변은 적중하지만, 저는 그의 답변을 비동기성의 개념을 설명하는 데 도움이 되는 유추에 초점을 맞춘 덜 기술적인 것으로 보완하고 싶었습니다.


유추...

어제 제가 하던 일이 동료의 정보를 필요로 했습니다.내가 그에게 전화를 걸었더니, 대화는 이렇게 진행되었다.

안녕 밥, 지난주에 술집 어떻게 갔는지 알아야겠어.짐은 그것에 대한 보고서를 원하고 있고, 그것에 대해 자세히 알고 있는 사람은 당신뿐이에요.

: 물론이지, 하지만 30분 정도 걸릴 것 같아?

잘하네.정보를 얻으면 전화 주세요!

이 시점에서, 나는 전화를 끊었다.보고서를 완성하기 위해서는 밥의 정보가 필요했기 때문에, 저는 보고서를 남겨두고 대신 커피를 마시러 갔고, 그래서 몇 가지 이메일을 받았습니다.40분 후(밥이 느리다) 밥이 다시 전화를 걸어 제가 필요한 정보를 알려줬어요.이 시점에서, 나는 필요한 모든 정보를 가지고 있었기 때문에, 리포트로 작업을 재개했다.


대화가 이렇게 진행되었다고 상상해 보세요.

안녕 밥, 지난주에 술집 어떻게 갔는지 알아야겠어.짐은 그것에 대한 보고서를 원하고 있고, 그것에 대한 자세한 것은 당신만이 알고 있어요.

: 물론이지, 하지만 30분 정도 걸릴 것 같아?

잘하네.기다리고 있을게요.

그리고 나는 거기 앉아서 기다렸다.그리고 기다렸다.그리고 기다렸다.40분 동안.기다리기만 하고 있다.결국, 밥이 정보를 주었고, 우리는 전화를 끊었고, 나는 보고서를 완성했다.하지만 40분의 생산성을 잃었습니다.


이것은 비동기 동작과 동기 동작입니다.

이것이 바로 우리 질문의 모든 예에서 일어나고 있는 일입니다.이미지 로드, 디스크에서 파일 로드 및 AJAX를 통한 페이지 요청은 모두 느린 작업입니다(현대 컴퓨팅 환경에서).

JavaScript는 이러한 느린 작업이 완료되기를 기다리는 대신 느린 작업이 완료되었을 때 실행되는 콜백 함수를 등록할 수 있습니다.그러나 그 동안 JavaScript는 다른 코드를 계속 실행합니다.JavaScript가 느린 동작이 완료될 때까지 기다리는 동안 다른 코드를 실행한다는 사실은 동작을 비동기적으로 만듭니다.JavaScript가 다른 코드를 실행하기 전에 작업이 완료될 때까지 기다렸다면 동기 동작이었을 것입니다.

var outerScopeVar;    
var img = document.createElement('img');

// Here we register the callback function.
img.onload = function() {
    // Code within this function will be executed once the image has loaded.
    outerScopeVar = this.width;
};

// But, while the image is loading, JavaScript continues executing, and
// processes the following lines of JavaScript.
img.src = 'lolcat.png';
alert(outerScopeVar);

에 자바스크립트 로드를 lolcat.png스루우 작전입니다.이 느린 작업이 완료되면 콜백 함수가 실행되지만, 그 사이에 JavaScript는 다음 줄의 코드(즉, 다음 줄)를 계속 처리합니다. alert(outerScopeVar)

'이 '알림'으로 됩니다.undefinedalert()이미지가 로드된 후가 아니라 즉시 처리됩니다.

하려면 , 「」만.alert(outerScopeVar)콜백 함수에 코드를 입력합니다.그 결과, 우리는 더 이상 그 정보를 필요로 하지 않습니다.outerScopeVar로 선언된

var img = document.createElement('img');

img.onload = function() {
    var localScopeVar = this.width;
    alert(localScopeVar);
};

img.src = 'lolcat.png';

JavaScript에서는 콜백이 함수로 지정되어 있는 것을 항상 확인할 수 있습니다.콜백은 일부 코드를 정의하는 유일한 방법이기 때문에 나중에 실행할 때까지 실행되지 않습니다.

'''가 사용되고 .function() { /* Do something */ }콜백입니다.모든 예를 수정하려면 , 조작의 응답을 필요로 하는 코드를 거기로 이동하기만 하면 됩니다.

* 으로는 *를 사용할 수 eval()마찬가지로, 그러나 이 목적에는 나쁘다.


발신자를 기다리게 하려면 어떻게 해야 합니까?

현재 이와 유사한 코드가 있을 수 있습니다.

function getWidthOfImage(src) {
    var outerScopeVar;

    var img = document.createElement('img');
    img.onload = function() {
        outerScopeVar = this.width;
    };
    img.src = src;
    return outerScopeVar;
}

var width = getWidthOfImage('lolcat.png');
alert(width);

이 에서 ""는 "" " " " " " 입니다.return outerScopeVaronload이치노 로로로 .getWidthOfImage()(Return)undefined , , , , 입니다.undefined고를받받 있있있있있

를 해결하려면 , 「를하는 함수를 사용할 수 있도록 하겠습니다.getWidthOfImage()콜백을 등록하고 해당 콜백 내에 있도록 너비에 대한 경고를 이동한다.

function getWidthOfImage(src, cb) {     
    var img = document.createElement('img');
    img.onload = function() {
        cb(this.width);
    };
    img.src = src;
}

getWidthOfImage('lolcat.png', function (width) {
    alert(width);
});

는 글로벌 변수)를 할 수 width를 참조해 주세요.

다음은 빠른 참조를 원하는 사용자를 위한 보다 간결한 답변과 약속 및 비동기/대기 사용 예를 제시하겠습니다.

우선 메서드(이 경우 비동기 메서드)를 (이 경우 비동기 메서드)에 어프로치않음)부터합니다.setTimeout및 을 누릅니다.

function getMessage() {
  var outerScopeVar;
  setTimeout(function() {
    outerScopeVar = 'Hello asynchronous world!';
  }, 0);
  return outerScopeVar;
}
console.log(getMessage());

undefined.getMessagesetTimeout되어 갱신됩니다.outerScopeVar.

이 문제를 해결하기 위한 두 가지 주요 방법은 콜백과 약속사용하는 것입니다.

콜백

은 '다르다'입니다.getMessagecallback이 파라미터는 결과를 발신자 코드로 되돌리기 위해 호출됩니다.

function getMessage(callback) {
  setTimeout(function() {
    callback('Hello asynchronous world!');
  }, 0);
}
getMessage(function(message) {
  console.log(message);
});

약속들

약속은 여러 비동기 조작을 조정하기 위해 자연스럽게 결합할 수 있기 때문에 콜백보다 유연한 대안을 제공합니다.Promise/A+ 표준 구현은 기본적으로 node.js(0.12+) 및 많은 최신 브라우저에서 제공되지만 Bluebird Q와 같은 라이브러리에서도 구현됩니다.

function getMessage() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve('Hello asynchronous world!');
    }, 0);
  });
}

getMessage().then(function(message) {
  console.log(message);  
});

jQuery

jQuery는 지연된 약속과 유사한 기능을 제공합니다.

function getMessage() {
  var deferred = $.Deferred();
  setTimeout(function() {
    deferred.resolve('Hello asynchronous world!');
  }, 0);
  return deferred.promise();
}

getMessage().done(function(message) {
  console.log(message);  
});

비동기/비동기

JavaScript 환경에서 및 (Node.js 7.6+와 같은)에 대한 지원이 포함되어 있는 경우, 다음과 같이 약속을 동기화하여 사용할 수 있습니다.async★★★★

function getMessage () {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve('Hello asynchronous world!');
        }, 0);
    });
}

async function main() {
    let message = await getMessage();
    console.log(message);
}

main();

을 하자면 은 을 나타낸다.outerScopeVar

비동기 함수는 다음과 같습니다.

비동기식 커피콜

다른 답변들은 훌륭하고 나는 이것에 대한 솔직한 답변을 하고 싶다.jQuery 비동기 호출로 제한

콜('Ajax' )$.get ★★★★★★★★★★★★★★★★★」$.post ★★★★★★★★★★★★★★★★★」$.ajax을 사용하다

예를 들면

var outerScopeVar;  //line 1
$.post('loldog', function(response) {  //line 2
    outerScopeVar = response;
});
alert(outerScopeVar);  //line 3

코드 실행은 회선1부터 시작하여 변수를 선언하고 회선2의 비동기 콜(즉, 포스트 요구)을 트리거하여 포스트 요구가 실행이 완료될 때까지 기다리지 않고 회선3부터 실행을 계속합니다.

되는 데 .이 값은 10초입니다.이 값은outerScopeVar10월 10살

시험삼아,

var outerScopeVar; //line 1
$.post('loldog', function(response) {  //line 2, takes 10 seconds to complete
    outerScopeVar = response;
});
alert("Lets wait for some time here! Waiting is fun");  //line 3
alert(outerScopeVar);  //line 4

이 작업을 실행하면 3번째 줄에 경보가 표시됩니다.이제 게시 요청이 일부 값을 반환한 것이 확인될 때까지 잠시 기다려 주십시오.그런 다음 확인을 누르면 기다렸기 때문에 알림 상자에서 다음 알림이 예상 값을 인쇄합니다.

실제 시나리오에서 코드는

var outerScopeVar;
$.post('loldog', function(response) {
    outerScopeVar = response;
    alert(outerScopeVar);
});

비동기 콜에 의존하는 모든 코드는 비동기 블록 내에서 이동하거나 비동기 콜을 대기함으로써 이동됩니다.

시나리오에서는, 「」를 참조해 주세요.outerScopeVar비동기적으로 변경 또는 할당되거나 나중에 발생합니다(일부 이벤트가 발생할 까지 대기 또는 대기).따라서 이러한 모든 경우의 현재 실행 흐름은outerScopeVar = undefined

각 예에 대해 설명하겠습니다(일부 이벤트가 발생할 경우 비동기적으로 호출되거나 지연되는 부분을 표시했습니다).

1.

여기에 이미지 설명 입력

여기에서는 특정 이벤트에서 실행되는 이벤트리스트너를 등록합니다.이치노 현재 .img.src = 'lolcat.png'; ★★★★★★★★★★★★★★★★★」alert(outerScopeVar);하지 않을 수 , 기능, 기능, 기능, 기능, 기능, 기능, 기능.img.onload참조된 이미지가 비동기적으로 로드될 때까지 기다립니다.다음 예에서는 이벤트가 다를 수 있습니다.

2.

2

여기서 타임아웃이벤트는 지정된 시간이 경과한 후 핸들러를 호출하는 역할을 합니다. 있습니다.0, 하면 비동기 가 '비동기 이벤트"의 이 이벤트는 의 마지막 위치에 추가됩니다.Event Queue이 경우 보증 지연이 발생합니다.

3.

여기에 이미지 설명 입력 이번에는 에이잭스 콜백.

4.

여기에 이미지 설명 입력

노드는 비동기 코딩의 제왕으로 간주할 수 있습니다.여기서 마킹된 함수는 지정된 파일을 읽은 후 실행되는 콜백 핸들러로 등록됩니다.

5.

여기에 이미지 설명 입력

명백한 약속(앞으로 어떤 일이 일어날 것)은 비동기적이다.JavaScript에서 지연, 약속미래의 차이점은 무엇입니까?

https://www.quora.com/Whats-the-difference-between-a-promise-and-a-callback-in-Javascript

간단한 답은 비동기성입니다.

비동기화가 필요한 이유

JavaScript는 싱글 스레드입니다.즉, 스크립트의 2비트를 동시에 실행할 수 없고, 연속해서 실행할 필요가 있습니다.브라우저에서 JavaScript는 브라우저마다 다른 많은 다른 항목과 스레드를 공유합니다.그러나 일반적으로 JavaScript는 그림 그리기, 스타일 업데이트 및 사용자 작업 처리(예: 텍스트 강조 표시 및 양식 컨트롤과의 상호 작용)와 동일한 대기열에 있습니다.이 중 하나의 활동은 다른 것들을 지연시킵니다.

이 문제를 해결하기 위해 이벤트와 콜백을 사용했을 것입니다.다음은 이벤트입니다.

var img1 = document.querySelector('.img-1');

img1.addEventListener('load', function() {
  // image loaded
  console.log("Loaded");
});

img1.addEventListener('error', function() {
  // error caught
  console.log("Error printed");
});
<img class="img-1" src="#" alt="img">

이건 재채기가 아니에요.이미지를 가져와 몇 명의 청취자를 추가하면 JavaScript는 해당 청취자 중 하나가 호출될 때까지 실행을 중지할 수 있습니다.

유감스럽게도 위의 예에서는 이벤트를 듣기 전에 이벤트가 발생했을 가능성이 있으므로 이미지의 "완전" 속성을 사용하여 이 문제를 해결해야 합니다.

var img1 = document.querySelector('.img-1');

function loaded() {
  // image loaded
  console.log("Loaded");
}

if (img1.complete) {
  loaded();
} else {
  img1.addEventListener('load', loaded);
}

img1.addEventListener('error', function() {
  // error caught
  console.log("Error printed");
});
<img class="img-1" src="#" alt="img">

이것은, 청취할 기회가 생기기 전에 에러가 난 이미지를 검출하는 것이 아닙니다.불행하게도 DOM에서는 이 작업을 수행할 수 없습니다.또, 이것은 하나의 이미지를 로드하고 있습니다.이미지 세트가 로드된 시기를 알고 싶다면 상황은 더욱 복잡해집니다.

이벤트가 항상 최선의 방법은 아닙니다.

란 같은 번할 수 있는 일(즉, 여러 번 발생할 수 있습니다.keyup,touchstart그런 이벤트에서는 청취자를 연결하기 전에 무슨 일이 일어났는지는 별로 신경 쓰지 않습니다.

이를 올바르게 수행하기 위한 두 가지 주요 방법은 콜백과 약속입니다.

콜백

콜백은 다른 함수의 인수 내에 전달되는 함수입니다.함수는 객체이며 객체는 함수의 인수로서 전달될 수 있기 때문에 이 절차는 JavaScript에서 유효합니다.콜백 함수의 기본 구조는 다음과 같습니다.

function getMessage(callback) {
  callback();
}

function showMessage() {
  console.log("Hello world! I am a callback");
}
getMessage(showMessage);

약속.

Vanilla JS를 통해 콜백 지옥을 막을 수 있는 방법이 있지만, 약속은 점점 더 인기를 얻고 있으며 현재 ES6에서 표준화되고 있습니다(Promise 참조).

약속은 비동기 연산의 최종 결과(값)를 나타내는 자리 표시자입니다.

  • 약속 자리 표시자는 결과 값(성공한 경우) 또는 실패 이유(성공하지 못한 경우)로 대체됩니다.

만약 당신이 어떤 일이 언제 일어났는지 알 필요가 없고 단지 그것이 일어났는지 아닌지를 알 필요가 있다면, 약속은 당신이 찾고 있는 것이다.

약속은 이벤트청취자와 비슷하지만 다음과 같은 점이 있습니다.

  • 약속은 한 번만 성공하거나 실패할 수 있다
  • 약속은 실패에서 성공으로, 또는 그 반대로 바꿀 수 없다
  • 일단 결과를 얻으면 약속은 불변의 것이다
  • 약속이 성공했는지 실패했는지 나중에 성공/실패 콜백을 추가하면 올바른 콜백이 호출됩니다.
  • 콜백을 추가하기 전에 이벤트가 발생했다는 것은 문제가 되지 않습니다.

주의: Promise 내의 함수에서 항상 결과를 반환하십시오.반드시 반환하지 않으면 후속 함수가 동작할 수 없습니다.

약속 용어

약속은 다음과 같습니다.

  • 했습니다.이치노
    • 비동기 작업이 완료되었습니다.
    • 그 약속은 가치가 있다
    • 약속은 두 번 다시 변하지 않을 것이다
  • 액션이 했습니다.이치노
    • 비동기 작업이 실패했습니다.
    • 약속은 결코 이행되지 않을 것이다
    • 그 약속에는 조작이 실패한 이유를 나타내는 이유가 있다
    • 약속은 두 번 다시 변하지 않을 것이다
  • 또는 거부아직 이행하지 않았거나 거부됨
    • 비동기 작업이 아직 완료되지 않았습니다.
    • 충족되거나 거부된 상태로 이행할 수 있다
  • 해결 완료:충족되거나 거부되어 불변의

약속 작성 방법

function getMessage() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve('Hello world! I am a promise');
    }, 0);
  });
}

getMessage().then(function(message) {
  console.log(message);
});

언급URL : https://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron