【问题标题】:Array.prototype.some() asynchronousArray.prototype.some() 异步
【发布时间】:2019-12-07 07:15:08
【问题描述】:

我需要在 array.some() 内运行异步代码,它本身就在 array.every() 内。 所以基本上我希望回调是async,所以我可以在其中使用await

但是Array.prototype.some()Array.prototype.every() 都不接受异步回调,这将要求它们返回一个 Promise。

【问题讨论】:

标签: javascript arrays asynchronous async-await


【解决方案1】:

这是我想出的some()every() 的异步版本

someAsync()

Array.prototype.someAsync = function (callbackfn) {
    return new Promise(async (resolve,reject) => {
        await Promise.all(this.map(async item => {
            if (await callbackfn(item))   resolve(true)
        })).catch(reject)
        resolve(false)
    })
}

// Examples
['',0,undefined,false].someAsync(async e=>e).then(e=>console.log(e)) // false
['',0,undefined,false,true].someAsync(async e=>e).then(e=>console.log(e)) // true

everyAsync()

Array.prototype.everyAsync = function (callbackfn) {
    return new Promise(async (resolve,reject) => {
        await Promise.all(this.map(async item => {
            if (! await callbackfn(item))   resolve(false)
        })).catch(reject)
        resolve(true)
    })
}

// Examples
[[],{},1,true].everyAsync(async e=>e).then(e=>console.log(e)) // true
[[],{},1,true,false].everyAsync(async e=>e).then(e=>console.log(e)) // false

缺点

  • 他们只接受回调并且只有一个参数
  • 即使 someAsync() 在解析 truthy 值后立即解析 true,并且在解析 falsy 值后everyAsync() 解析 false , 对于 每个 元素,回调仍然会执行到最后,即使方法的承诺已经解决。我认为这没有直接的解决方案,只要promises are not cancellable

【讨论】:

  • Promise executors 不应该是async,当他们可以抛出时,它们可以——数组中的任何拒绝最终都会导致未处理的拒绝。 (resolve, reject) => Promise.all(…).then(() => { resolve(false or true) }).catch(reject) 而不是,也许?
  • 缺点只存在于元素没有按顺序处理。顺序处理元素有其自身的缺点,但更符合这些方法的同步版本。
  • @Ry- 为什么不呢?您只需要记住在 catch 块中使用 try/catch 并调用 reject。类似于您使用then/catch 的提议。
  • 把它做成一个wiki,这样你们都可以改进它
  • @JakeHolzinger:我说(好吧,打错了一个额外的“the”)“他们什么时候可以扔”。如果你正确使用try,他们就不会扔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2023-03-12
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多