javascript - JSHint、For 循环、Promises 和一个讨厌的 lint 错误

标签 javascript promise jshint lint rsvp.js

我在 JavaScript 中遇到了一种情况,我生成了许多 promise ,我想将这些 promise 附加到每个 promise 上,以处理个人问题。

我正在使用 RSVP Promise 库,它允许我使用 allSettled 来确定所有 Promise 何时已得到解决。 RSVP 的 allSettled 确实为我提供了在所有已解决的 promise 结束时成功和失败的输出的评估,但通过添加 then/catch 对于每个 Promise,我可以更好地控制在特定 Promise 未实现时要做什么(例如提示用户仅使用那些失败的 Promise 重试等)。

使用我值得信赖的 linter (JSHint),我不断收到“不要在循环内创建函数。”对我大喊大叫,我真的希望能够附加 then/catch 每个 Promise 的条件,而不会出现这种 lint 错误。

我很好奇其他人如何解决与此相关的 JSHint 错误(除了更改 JSHint 规则之外。我认为这是一个很好的规则!)或者是否有人更好地了解如何处理我生成的 Promises' 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>

编辑:

我真的很好奇 forforEachmap 的性能差异,因此使用 @rasmeister 和 @hackerrdave 给出的答案我设计了一个 JSPerf 测试来尝试查看哪个循环的性能更高(为了好玩,我还加入了一个 while 测试): https://jsperf.com/for-foreach-map-while-loop-performance-testing

在我的测试中,结果差异很大并且非常不确定,因此我不知道哪种循环实现在性能方面更好,但就可读性而言,我认为我必须使用 map 选项。

最佳答案

let Promise = RSVP.Promise
let people = ['Marty McFly', 'Doc', 'Robocop', 'Terminator', 'Bozo']
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))
  })
}

let sendMessagesToPeople = people.map((person) => {
  return sendMessageToPerson(person, "Hi there!")
  .then(() => {
      thoseSucceeded.push(person)
    })
    .catch(() => {
      thoseFailed.push(person)
    })
})

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>

这会将 promise 收集到一个数组中,然后您可以在其中响应所有内容。

关于javascript - JSHint、For 循环、Promises 和一个讨厌的 lint 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42179157/

相关文章:

JavaScript 显示错误结果

javascript - 如何在 Javascript 中提取不完整 JSON 数组中对象的值?

javascript - 谷歌应用程序脚本 : How to fix "content is not allowed in prolog"

javascript - 在 promise 链中等待 DOM 元素中的突变

javascript - 从 AngularJS 中的链式 .then() 函数返回的 Promise 之间的关系是什么

javascript - 使用 jshint 和 jenkins checkstyle-plugin 配置特定警告以报告错误

javascript - Raspberry Pi, raspivid -> VLC -> video.js 参数在浏览器中查看Pi视频

javascript - Promise 抛出 "Unhandled promise rejection"错误的奇怪行为

javascript - JSHint 不接受文件内容作为参数

javascript - 一处可能存在严重违规,另一处则不然