编辑:
我最初有点困惑,并复制并粘贴了我写的东西以备不时之需。对于那个很抱歉。
就像@Bergi 所说,如果您需要来自数组的 Promises 数组,objects
那么通常最好使用.map()
. 如前所述,这看起来像:
const getPromises = (objects) => {
return objects.map(object => new Parse.Promise.as()
.then(() => {
return destroy(object);
})
);
}
// No 'temp' array needed, and most important: promise variables aren't 'lost'
// Then you can similarly use this pattern:
return Parse.Promise.when(getPromises(objects));
// Or this:
return Promise.all(getPromises(objects));
我最初的答案(如下)本身就有点模棱两可,希望我上面的答案能给它更多的背景。:)
我避免使用for
循环或Array.forEach
. 当我发现.forEach()
我将它用于所有事情时,假设它是我for loops
混乱的答案。我开始了解到两者在 99.99% 的情况下都是代码气味。原因:它们通常需要临时数组,并使嵌套循环非常尴尬。
虽然.map()
当您的数组大小相同时(1:1 或 20:20)在很大程度上解决了这个问题,但其他Array
方法对于非对称变换 20:1 很有用(例如:将 20 个产品的成本总计为 1 个数字,或者在名单):
.map - use for 1:1 array transforms, as @bergi suggests.
.reduce - useful for transforming 1 array into ANYTHING else. Need a sum or subtotal? Or results grouped by day? Use .reduce().
.filter - return only items which result in a `true` result
.find - use to avoid full array scans when only 1 item must be returned.
.some - exit array scan returning true at first opportunity
let downloadedMsgs = emails.map(m => downloadBody(m))
let recipientsCount = emails.reduce((count, m) => count + m.to.length, 0)
let onlyRecentMsgs = emails.filter(m => m.isNew)
let aRecentMsg = emails.find(m => m.isNew)
let hasNewMessage = emails.some(m => m.isNew)
// (Notice last 3 identical predicate fn's with different uses: aka pluripotency)
代码中的另一个问题是丢失 Promise 的风险!这一点很重要,如果您的数组中可能有几十个或几百个对象,那么在循环中触发 HTTP 请求将非常不可靠(最终您会耗尽可用的套接字)。限制这种情况的最好方法是返回你的 Promise。