2017-09-14 1 views
1

약속이 붙어 있습니다.다이아몬드 모양의 js에 약속 체인을 만드는 방법

내 프로그램 구조는 내가이 작업을지고 약간의 문제가있어이

  Func A    //gets data then passes to I1 and J2 
     /  \ 
     Func I1  Func J1  //then route I & J run without interaction 
     |   | 
     Func I2  Func J2  
     \  /
      Func B   //Func B gets both the result of both 

같이 말한다. 나는 지금까지이야

getdata.then(data=>{ 
     var methods = Promise.all([ 
     funci1.x(data).then(output=>{ 
      funci2.x(output) 
     }), 
     funcj1.x(data).then(output2=>{ 
      funcj2.x(output2) 
     }) 
     ]) 
     methods.then(([a,b])=>{ 
     console.log(a,b); 
     }) 
    }) 

그러나 작동하지 않는 것 같습니다. 어떤 도움이 필요합니까?

당신은 당신이 then() 콜백에 Promise에 주조 할 수있는 일을 반환하므로이 그것을 변경하지 마십시오
+1

큰 문제는 화살표 기능의 사용입니다 참조하십시오. 명확히하기 위해'() => {...}'는 중괄호 안에있는 코드를 실행하고 명시적인'return' 문이있는 경우에만 값을 반환합니다. '() => statement'은 암시 적으로'statement'의 결과를 암시합니다. – Phil

+0

은 사다리꼴과 비슷합니다 (Simpsons reference) –

답변

3

:

getdata.then(data => { 
    var methods = Promise.all([ 
    funci1.x(data).then(output => funci2.x(output)), 
    funcj1.x(data).then(output2 => funcj2.x(output2)) 
    ]) 
    methods.then(([a, b]) => { 
    console.log(a, b); 
    }) 
}) 
+0

아주 미묘한 차이점을 지적하고 싶을 수도 있습니다 – Phil

1

개인적으로 무슨 일이 일어나고 있는지 확인하기 위해 작성된 쉽게 이런 식으로 약속을 찾을 수 . funcJ2 및 funcI2가 완료되면

const funcJ1 = (num) => { 
    num = num + 1; 
    return funcJ2(num); 
} 
const funcJ2 = (num) => (
    new Promise((resolve, reject) => { 
    num = num + 1; 
    resolve(num); 
    }) 
); 

const funcI1 = (num) => { 
    num = num + 1; 
    return funcI2(num); 
} 
const funcI2 = (num) => (
    new Promise((resolve, reject) => { 
    num = num + 1; 
    resolve(num); 
    }) 
); 

const funcB = (result) => { 
    let total = 0; 
    total = total + result[0]; // first promise result 
    total = total + result[1]; // second promise result 
    console.log(total); 
}; 

const funcA = (x) => { 
    const promises = []; 
    promises.push(funcJ1(x)); 
    promises.push(funcI2(x)); 
    Promise.all(promises).then((res) => { 
     funcB(res); // done with I and J 
    }).catch((e) => { 
     throw e; 
    }); 
} 

funcA(1); 

funcJ1 및 funcI1 병렬 및 funcB에서 모두 실행이 실행됩니다.

이 jsfiddle https://jsfiddle.net/6fvLw8wv/

+0

어떻게 j1과 i1을 얻을 수 있습니까? func의 데이터에서 실행하려면 – Harryw

+0

나는 funcA에 인수를 수정하고 전달했습니다. 도움이되는 희망. – dmo

관련 문제