2017-02-04 5 views
0

에서 나는 단순한 약속이 있습니다포장 약속 + 다음 새 약속

function p(l) { 
    return new Promise(function(resolve) { 
    alert(l); 
    resolve(); 
    }); 
} 

이 그때 그 다음 절입니다 후에 만 ​​해결할 약속을 만들려고을 :

function pp(l1, l2) { 
    return new Promise(function(resolve) { 
    p(l1).then(() => { 
     alert(l2); 
     resolve(); 
    }); 
    }); 
} 

내가 지금 :

p('start').then(pp('A', 'B')).then(p('end')); 

내가 할 전망 : 시작, A, B, 최종
하지만 대신 내가 볼 : 시작, A, 끝, B

왜?

내가 원하는 것을 달성하고, 절이 끝나면 해결할 약속 (pp)을 어떻게 만들 수 있습니까? 두 번째 기능에

+1

'.then (() => pp ('A', 'B'))'는 문제를 해결할 것입니다. 자세한 대답을하십시오. – coyotte508

+0

그러면 ** p ('start'), then (p ('A')), then (p ('B')), then (p ('End')); ** 원하는 시퀀스를 얻을 수 있습니다. 그러나 ** ** 아무 것도 해결하지 않는다는 약속이 있다면 말이되지 않습니다. 경고 ('시작'), 경고 ('A'), 경고 ('B'), 경고 ('종료')로도 동일한 작업을 수행 할 수 있습니다. 아무 것도 해결하지 못하는 약속을하는 것이 실제로 의미가 없습니다. – Hosar

+0

coyotte508 - 아니, 나에게 준다 : 시작, 끝, A, B – kofifus

답변

0

pp 더 간단하게 코딩 할 수있는 데모입니다 :

당신은 복잡한 코드를 매번 작성해야 할 경우는, 약속의 전체 지점입니다

function pp(l1, l2) { 
    return p(l1).then(() => { 
    alert(l2); 
    }); 
} 
는, 그것이 :) 또한

, .then가 매개 변수로 이전 약속의 반환 값을 함수 콜백을 기대 가치가 없어/기능.

p('start').then(() => pp('A', 'B')).then(() => p('end')); 

당신이 그것을가 될 운명이됩니다으로 .then 체인을 사용하지 않는 외부, 당신의 행동을 한 정확한 이유에 관해서는, 나는 이유는 명확하지 않다.

그리고이 코드가 작동하는 이유는 Promise을 콜백에 반환하면 해당 Promise이 실행되고 해결 된 값이 다음 콜백에 인수로 전달되기 때문입니다. () => pp('A', 'B')() => { return pp('A', 'B');}과 동일하며 체인의 다음 콜백을 호출하기 전에 pp이 리턴되고 대기합니다.

function pp(l1, l2) { 
    return() => p(l1).then(() => { 
    alert(l2); 
    }); 
} 

을하지만 당신은 더 이상 Promise로 사용할 수 있습니다 :

같은 .then 호출 구문을 유지하려면

후 일 것 대신 Promise의 콜백을 반환 pp을 변경. 연쇄의 마지막 부분은 여전히 ​​변경해야합니다 : .then(() => p('end')).

+0

thx! 이 문제는 PP (')'> pp ('A', 'B') ..와 같은 방식으로 pp를 호출하는 책임을 최상위 레벨로 이동 시킨다는 것입니다. 에 대한. 나는 'then'절이 있다는 것을 알지 못하고 체인을 연결하는 최상위 코드를 원한다. ... return() => ... pp로 이동하기 위해 답을 바꿀 수있다. 그 다음에 나는 그것을 표시 할 것이다 – kofifus

+0

how about : function pp (l1, l2) { return() => {p (l1).> (alert (l2); }); }}? (추가 된 {}) ...이게 안전합니까? 나는 그것을 약속으로 사용할 수 있습니까? – kofifus

+0

@kofifus'{}'를 추가하면'return'도 추가해야합니다 : function pp (l1, l2) { return() => {return p (l1) .then (() => { alert (l2); });}; } ' – coyotte508

0

function pp(l1, l2) { 
    return new Promise(function(resolve) { 
    alert(l1); 
    alert(l2); 
    resolve(); 
    }); 
} 

를 다음 시도 아니면 pp 내부 p 기능을 넣어하려는 경우 다음 여기에

function pp(l1, l2) { 
    return p(l1).then(() => { 
    alert(l2); 
    }); 
} 



p('start').then(() => pp('A', 'B')).then(() => p('end')); 

https://plnkr.co/edit/fUisfcWrTu89xcc4j0cu?p=preview

0

mdn - "onFulfilled : A 기능 약속이 이행 될 때 호출되는 기능.이 함수에는 하나의 인수 인 fulfillment 값이 있습니다."

내 코드의 문제는 then(pp('A', 'B'))에 내가 then (약속이다 PP()의 결과)과하지를 통과 것을이었다 기능 (호출의 이행 값을 수신하는 기능

function p(l) { 
 
    return new Promise(function(resolve) { 
 
    alert(l); 
 
    resolve(); 
 
    }) 
 
} 
 

 

 
function pp(l1, l2) { 
 
    return p(l1).then(() => p(l2)); 
 
} 
 

 

 
p('start').then(() => pp('A', 'B')).then(() => p('end'));

: 약속)

그럼 사용하는 올바른 방법은 항상 그것을 함수를 전달하는 것입니다