2017-12-30 6 views
0

전체 앱에서 얼마나 많은 약속이 대기 중인지 알 수있는 방법이 있습니까?node.js 얼마나 많은 약속이 대기 중인지 (전 세계적으로)

레코드를 배치 모드로 데이터베이스에 보내고 있습니다 (sequelize 포함). 각 삽입은 약속이며, 요청 비율은 결의보다 높으므로 보류중인 약속의 수가 증가하고 있습니다.

좋은 접근 방법은 무엇입니까? 각 삽입을 기다리는 것은 덜 효율적으로 보이지만, 내가 기다리고있는 약속이 성장하게되면 결국 붕괴 될 것이라고 생각합니다.

지금까지 성장률을 분석하고 가능한 해결책을 연구하거나 아이디어를 얻으려는 전 세계적으로 얼마나 많은 약속이 기다리고 있는지 알고 싶습니다.

+0

당신은 배열에 당신은 그들이 모든 경우에 처리 할 수 ​​promise.all를 사용할 수있는 방법을 그들에게 참조를 유지해야 끝마친. – magreenberg

+0

약속을 세지 마십시오 (심지어 전세계 약속). 당신이 염려하는 특정 삽입을 센다. – Bergi

답변

3

...하지만 미정 인 약속이 커지면 결국 붕괴 될 것입니다.

메모리가 부족하거나 후속 커넥터가 해결되지 않은 요청 수를 처리 할 수없는 지점에 도달했기 때문에. 그러나 예, 미해결 요청의 수를 지속적으로 늘리지 않으려합니다.

이 당신이 말할 아무것도 내장은, 그러나 당신은 쉽게 간단하게 트랙을 유지하여 뛰어난 얼마나 많은 관련 사람들의 알 수 있습니다 :

let outstanding = 0; 
function track(p) { 
    ++outstanding; 
    p.catch(e => e).then(() => { 
     --outstanding; 
    }); 
    return p; 
} 

그럼 그냥 track에 호출에 sequelize 호출을 포장 : 당신이 finally와 약속 라이브러리를 사용 (또는 the proposal에서 polyfill 사용)하는 경우

track(calltoSequelize(/*...*/)).then(/*...*/); 

, track은 다음과 같습니다

let outstanding = 0; 
function track(p) { 
    ++outstanding; 
    return p.finally(() => { 
     --outstanding; 
    }); 
} 
+0

고마워요, 마침내 그다지 커지지 않았습니다 (결코 뛰어난 20 점을 얻지 못했습니다). 한가지 질문은, 나는 당신의 구조를 이해하지 못합니다. p.catch (e => e) .then() .... 거기에 무엇이 붙잡습니까? (그것은 작동하지만) – Joan

+1

@ 조안 : 그것은 "가난한 사람의 마침내'". :-)'catch'는 해결을 거부하고, 이후의'then' 핸들러는 항상 호출됩니다 (프로젝트가 거부되거나 해결되는지 여부). (그렇다면'then '을 호출 한 결과를 반환하는 대신'p'를 반환하는 이유이기도합니다. 왜냐하면 전체적으로 약속을 거부하는 행동을 엉망으로 만들고 싶지 않기 때문입니다.) –

0

this을 사용하여 활성 약속을 조절할 수 있습니다. 네가 약속 한거 같아. 배열에 너는 얼마나 큰가? (가) 값을 거부

TJ은 좋은 대답을 가지고 있지만 당신이 던져 다시해야

var trackPromise = (
 
    outstanding => { 
 
    return { 
 
     add:p => { 
 
     outstanding++; 
 
     return p.then(x=>{ 
 
      outstanding--; 
 
      return x; 
 
     }) 
 
     .catch(
 
      err=>{ 
 
      outstanding--; 
 
      return Promise.reject(err); 
 
      } 
 
     ); 
 
     }, 
 
     count:()=>outstanding 
 
    }; 
 
    } 
 
)(0) 
 

 
trackPromise.add(Promise.resolve(22)) 
 
.then(
 
    resolve=>console.log("resolved:",resolve), 
 
    reject=>console.warn("rejected:",reject) 
 
); 
 
trackPromise.add(Promise.reject(0)) 
 
.then(
 
    resolve=>console.log("resolved:",resolve), 
 
    reject=>console.warn("rejected:",reject) 
 
); 
 
console.log("active:",trackPromise.count())

관련 문제