【问题标题】:async.js each with object method?async.js 每个都有对象方法?
【发布时间】:2015-03-14 16:44:18
【问题描述】:

我有一个带有一堆函数的对象,我想针对这些对象列表中的每个元素运行一些测试。所以我在这些对象方法中进行了测试,并希望在async.each 中运行它们。

尝试(CoffeeScript + Mocha)

{format} = require 'util'
async    = require 'async'

class Foo
    constructor: (@bar) ->

class Bar extends Foo
    whoami_sync: => @bar
    whoami_async: (cb) => cb null, @bar

objects = [{foo:'bar'}, {bar:'foo'}].map (obj) -> new Bar obj

describe 'something', ->
    it "does't", (done) ->
        async.each objects, ((item) ->
            objects[objects.indexOf(item)].whoami_async), done

    it 'does', (done) ->
        res_list = [obj.whoami_sync() for obj in objects]
        console.log format '[obj.whoami_sync() for obj in objects] = %j', res_list
        done if res_list.filter((elem) -> !elem.length).length then new Error else null

错误输出(同步测试通过)

1) 有些东西没有: 错误:超过 2000 毫秒的超时

【问题讨论】:

  • 不应该是.map() 而不是.forEach()
  • 哎呀,是的。在这个简短的测试用例中重写了我更长的示例,一定忘记检查那行。
  • objects[objects.indexOf(item)] 看起来写item 的路很长。您应该调用whoami_sync 方法,而不仅仅是引用它。普通方法应该用->创建,而不是=>
  • 嗯,第一个是对的。想知道我为什么要这样写? - 至于第二个,如果我需要访问self,我不需要=>吗?

标签: javascript node.js coffeescript mocha.js async.js


【解决方案1】:

async.each 的第二个参数是一个迭代器函数,它应该接受两个参数,而不是一个;当迭代器的工作完成时,应该调用第二个。例如,这有效:

async.each [1, 2, 3],
    ((x, next) -> console.log x; do next),
    ((err) -> console.log 'done')

如果您的迭代器是异步的,请将函数传递给异步操作,以便它可以在完成时调用它:

asyncOp = (x, next) ->
    console.log "checking #{x}"
    if x > 1
        next "#{x} is too big"
    else
        next null

async.each [1, 2, 3],
    ((x, next) -> asyncOp x, next),
    (err) -> console.log err

【讨论】:

  • 谢谢,但我的 cb 处理程序仍然无法正常工作。即:async.each objects, ((item, next) -> objects[objects.indexOf(item)].whoami_async; do next), done 将始终成功,即使它被定义为:whoami_async: (cb) => cb new Error
  • 您必须将next 提供给whoami_async,以便它可以在完成时调用它。
  • 完美,可行。编辑你的答案,我会接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2013-07-05
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多