여러 가지 방법으로이 문제에 접근 할 수 있습니다. 아마 그냥 재귀 사슬로 묶인 약속을 사용하고 나서 이전 호출의 마무리를 기반으로 타이머를보다 정확하게 사용할 수 있으며 호출을 호출하고 오류 전파를 처리 할 수 있습니다.
여기서는 mailer.sendEmail()
이 node.js 콜백 호출 규칙을 따른 것으로 가정 했으므로 여기에 "promisify"해야합니다. 이미 약속을 반환하면 내가 만든 sendEmail()
함수 대신 직접 사용할 수 있습니다.
어쨌든 여기에는 다양한 접근 방식이 있습니다.
리콜 같은 기능 후 딜레이 (지연 재귀)
// make promisified version - assumes it follows node.js async calling convention
let sendEmail = util.promisify(mailer.sendEmail);
function delay(t, data) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, data), t);
});
}
function sendAll(array) {
let index = 0;
function next() {
if (index < array.length) {
return sendEmail(array[index++]).then(function() {
return delay(100).then(next);
});
}
}
return Promise.resolve().then(next);
}
// usage
sendAll(userEmailArray).then(() => {
// all done here
}).catch(err => {
// process error here
});
사용하여 setInterval을 제어 할 페이스
또한 방금 새로운 요청을 시작하는 setInterval을 사용할 수있는 모든 배열이 비어있을 때까지 100ms :
// promisify
let sendEmail = util.promisify(mailer.sendEmail);
function sendAll(array) {
return new Promise((resolve, reject) => {
let index = 0;
let timer = setInterval(function() {
if (index < array.length) {
sendEmail(array[index++]).catch(() => {
clearInterval(timer);
reject();
});
} else {
clearInterval(timer);
resolve();
}
}, 100);
})
}
사용는 ES6에 await
를 사용할 수 있습니다에 "일시 중지"루프를
을 루프를 일시 정지 기다리고 그리고 :
// make promisified version - assumes it follows node.js async calling convention
let sendEmail = util.promisify(mailer.sendEmail);
function delay(t, data) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, data), t);
});
}
const promises = userEmailArray.map(async function(userEmail) {
await sendEmail(userEmail).then(delay.bind(null, 100));
});
Promise.all(promises).then(() => {
// all done here
}).catch(err => {
// process error here
});
액세스 순서에 약속과 함께 사용 .reduce()
배열로
당신은 약속 .reduce()
에 의해 구동 체인 사용 결과의 배열을 축적하려고하지만, 그냥 할 다음, 표준 방법을 시퀀스 싶지 않은 경우 : 블루 버드 기능 사용
// make promisified version - assumes it follows node.js async calling convention
let sendEmail = util.promisify(mailer.sendEmail);
function delay(t, data) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, data), t);
});
}
userEmailArray.reduce(function(p, userEmail) {
return p.then(() => {
return sendEmail(userEmail).then(delay.bind(null, 100));
});
}, Promise.resolve()).then(() => {
// all done here
}).catch(err => {
// process error here
});
을
const Promise = require('Bluebird');
// make promisified version - assumes it follows node.js async calling convention
let sendEmail = Promise.promisify(mailer.sendEmail);
Promise.map(userEmailArray, userEmail => {
return sendEmail(userEmail).delay(100);
}, {concurrency: 1}).then(() => {
// all done here
}).catch(err => {
// process error here
});
,536 : 동시성 제어 및 지연 모두
Bluebird promise library는 여기에 도움이 내장 된 몇 가지 유용한 기능을 가지고 있습니다
{concurrency: 1}
기능을 사용하여 동시에 여러 개의 요청이 전송되는 것을 제어하고 내장 된 .delay(100)
약속 방법을 제어합니다.
그냥 반복 사이에 지연과 배열을 시퀀싱에 대한 약간의 도우미 함수를 만드는 데 유용 할 수 있습니다, 일반적으로
를 사용할 수있는 순서 도우미를 만들고 :
function delay(t, data) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, data), t);
});
}
async function runSequence(array, delayT, fn) {
for (item of array) {
await fn(item).then(data => {
return delay(delayT, data);
});
}
}
그러면 필요할 때마다 헬퍼를 사용할 수 있습니다.
// make promisified version - assumes it follows node.js async calling convention
let sendEmail = util.promisify(mailer.sendEmail);
runSequence(userEmailArray, sendEmail, 100).then(() => {
// all done here
}).catch(err => {
// process error here
});
메일러는 무엇입니까? 그리고 그것이 당신에게 언제 보내 졌는지 알려주는 것은 무엇입니까? 약속이나 콜백을 통해 응답 할 때까지 기다리는 기능이 필요합니다. – Norguard
Express 또는 웹 응용 프로그램에서 실행됩니까? 그렇다면 요청을 초당 10 개 이하로 제한하더라도 함수가 여러 번 호출 될 수 있기 때문에 API에 실패 할 수있는 여러 요청이 서버에 생성 될 수 있습니다. – HMR