私は自分のJavaScriptに、個々の問題に対処するためにそれぞれthen
/catch
という条件を付けたいといういくつかの約束事を出しています。JSHint、For Loops、Promises、1つの厄介な糸くずりエラー
私はallSettled
を使用して、すべての約束がいつ解決されたかを判断できるRSVP Promiseライブラリを使用しています。 RSVPのallSettled
は、すべての決済済み約束の終了時に成功したものと失敗したものの出力を評価しますが、then
/catch
を各約束に追加することで、特定の約束が満たされない場合失敗したものだけを使用して再試行するように促すなど)。
私の信頼できるリンター(JSHint)、私は得続けるの使用「Don't make functions within a loop.
」私に戻って叫び、そして私は本当にアップトリミングリントこの種のエラーなく、各約束にthen
/catch
条件を付けることができるようにしたいです。
私は、JSHintのエラーを回避するためにJSHintのエラーを回避する方法を知りました(JSHintルールを変更するだけでなく、良いルールだと思います) then
/catch
ユースケースです。
ここでは例です:
let Promise = RSVP.Promise
let people = ['Marty McFly', 'Doc', 'Robocop', 'Terminator', 'Bozo']
let sendMessagesToPeople = []
let thoseSucceeded = []
let thoseFailed = []
// Dummy Promise method to send a message to a person
function sendMessageToPerson (person, msg) {
console.log(`Sending message to ${person}...`)
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
console.log(`✔︎ Sent "${msg}" to ${person}`)
resolve(person, msg)
return
}
console.log(`✘ Failed sending "${msg}" to ${person}`)
reject(person, msg)
}, 1000 + (Math.random() * 2000))
})
}
// Generate the array of Promises for allSettled to process
for (let i = 0; i < people.length; i++) {
let trySendMessageToPerson = sendMessageToPerson(people[i], "Hi there!")
/* Illegal, according to JSHint */
.then(() => {
thoseSucceeded.push(people[i])
})
.catch(() => {
thoseFailed.push(people[i])
})
sendMessagesToPeople.push(trySendMessageToPerson)
}
RSVP.allSettled(sendMessagesToPeople).then(() => {
console.log(`Succeeded: ${thoseSucceeded.length}, Failed: ${thoseFailed.length}`)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rsvp/3.3.3/rsvp.min.js"></script>
EDIT:
私は答えを使用してfor
、forEach
とmap
との性能の違いに関しては本当に興味がありました@rasmeisterと@hackerによって与えられるrdave私は(私も楽しみのためwhile
テストに投げた)よりパフォーマンスしたループのかを確認しようとするJSPerfテストを考案:私のテストの結果で https://jsperf.com/for-foreach-map-while-loop-performance-testing
は乱暴に変わり、非常に決定的でないので、私は持っていますどのループの実装がパフォーマンスに優れているのかわかりませんが、読みやすさの面ではmap
オプションを使用しなければならないと思います。