Promise 체인 호출 분석
Promise 체인 호출 분석
Promise가 무엇을 하는지 나는 군더더기 없이 설명할 것이다. 네가 이 글을 보았을 때, 나도 네가 Promise를 사용한 것을 묵인했다
먼저 예를 들다
//  id
function getUserId() {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(186)
      }, 1e3)
    })
}
//  id 
function getMobileByUserId(userId) {
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve(userId + '****5836')
        }, 1e3)
    })
}
  두 가지 방법, getUserId(약칭 IDfun)와 getMobileByUserId(약칭 MOfun)는 둘 다return에서 하나의 Promise 실례를 얻었다. 전자는 사용자 id를 얻고 후자는 사용자 id를 가지고 핸드폰 번호를 바꾸는 것이다. MOfun의 출력은 IDfun의 출력에 의존한다. 이렇게 하면 두 가지 다른 동작은 질서정연한 실행을 보장해야 한다.
여기에 대응하는 해결 방법이 있을 것이다. 나는 여기에 예시를 하나 열거했다.
IDfun()
    .then(MOfun)
    .then(function(res) {
        console.log(res)
    })
  우선, IDfun을 호출하여 그 Promise 실례의 then 방법에서 MOfun을 전송했고 그 뒤에 또한then 방법이다. 그 안에 하나의callback 함수가 전송되었다. 이때 callback 함수에서 출력된 값은 무엇이고 왜일까. 일반적인 상황에서 then 방법에서 전송된 것은 하나의callback인데 이 예에서 전송된 것은 Promise를 포함하는 함수이다.내부적으로 사용자의 id를 MOfun에 전달하고 출력하는 방법
이렇게 말하면, 나는 먼저 몇 가지 Promise 중의 몇 가지 비교적 핵심적인 방법을 열거한다.
// this Promise 
//  
this.then = function (onFulfilled) {
    return new Promise(function (resolve) {
        handle({
            onFulfilled: onFulfilled || null,
            resolve: resolve
        });
    });
};
function handle(deferred) {
    if (state === 'pending') {
        deferreds.push(deferred);
        return;
    }
    var ret = deferred.onFulfilled(value);
    deferred.resolve(ret);
}
//  state value , 
function resolve(newValue) {
    if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
        var then = newValue.then;
        if (typeof then === 'function') {
            then.call(newValue, resolve);
            return;
        }
    }
    state = 'fulfilled';
    value = newValue;     // value 
    setTimeout(function () {
        deferreds.forEach(function (deferred) {
            handle(deferred);
        });
    }, 0);
}
  이 몇 가지 방법을 참조하여 우리는 다시 아까 그 예로 돌아간다.
onFulfilled: onFulfilled || null,  //  onFulfilled === MOfun
resolve: resolve  // resolve BridgePro1 resolve}를 호출합니다.186function resolve(newValue) {   // newValue === 186
        if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
            var then = newValue.then;
            if (typeof then === 'function') {
                then.call(newValue, resolve);
                return;
            }
        }
        state = 'fulfilled';
        value = newValue;     // value 
        setTimeout(function () {
            // deferreds then 
            // [{
            //    onFulfilled: MOfun,
            //    resolve: resolve
            // }]
            deferreds.forEach(function (deferred) {  
                handle(deferred);
            });
        }, 0);
    }    // state === fulfilled
    // deferred ===> 
    //  {
    //    onFulfilled: MOfun,
    //    resolve: resolve
    //  }
    function handle(deferred) {
        if (state === 'pending') {
            deferreds.push(deferred);
            return;
        }
    
        var ret = deferred.onFulfilled(value);  // value === 186
        deferred.resolve(ret);
    }      function resolve(newValue) {   // newValue === MOPro
        if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
            // then  MOPro then
            var then = newValue.then;
            if (typeof then === 'function') {
                //  then , this MOPro, resolve, resolve BridgePro1 resolve, 
                then.call(newValue, resolve);
                return;
            }
        }
        state = 'fulfilled';
        value = newValue;     
        setTimeout(function () {
            deferreds.forEach(function (deferred) {  
                handle(deferred);
            });
        }, 0);
    }  // ===> callback
    function(res) {
        console.log(res)
    }
    this.then = function (onFulfilled) {
        // onFulfilled BridgePro1 resolve 
        //  Promise BridgePro2
        return new Promise(function (resolve) {
            handle({
                onFulfilled: onFulfilled || null,
                resolve: resolve  // BridgePro2
            });
        });
    };  1865836로 설정하고 순환 MOPRO의 deferreds 수조를 지연합니다. 이때 수조는: [
        {
            onFulfilled: resolve,   // BridgePro1 resolve
            resolve: resolve  // BridgePro2 resolve
        },
        {
             onFulfilled: callback,
            resolve: resolve  // BridgePro3 resolve
        }
    ]   function handle(deferred) {
        if (state === 'pending') {
            deferreds.push(deferred);
            return;
        }
    
        var ret = deferred.onFulfilled(value);
        deferred.resolve(ret);
    }  후기:
만약 내가 아래의 작법에 따라 계속 then을 내려가고 싶다면:
IDfun()
    .then(MOfun)
    .then(callback)
    .then(callback)
    .then(callback)
  모든 콜백에 핸드폰 번호를 출력할 수 있습니다. 어떻게 써야 하나요?
// callback
function callback(res) {
    // doing something
    console.log(res)
    return res
}
  요약:
Promise는 무엇입니까, 글자 그대로 하나의 약속입니다. 제가 당신에게 하나의 약속을 했습니다. 당신은 기억하고 있습니다. 언제 현금으로 바꿀지 모르지만 당신에게 대답을 할 것입니다. 그다지 형상적이지 않은 비유를 할 것입니다. 제가 은행에 가서 일을 처리하면 틀림없이 하나의 번호를 먼저 받을 것입니다. 이 번호는 하나의 약속과 같습니다. 언제 당신을 불러야 할지 확실하지 않지만 당신을 불러야 합니다. 그리고 이때 당신은 당신의 일을 처리할 것입니다. 종합하면,즉, Promise 체인식의 원리 해석을 위해 잘못된 부분은 지적을 환영합니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.