javascript - Node.js 中的对象字面量会阻塞吗

标签 javascript node.js asynchronous blocking promise

对象文字会阻塞吗?我试图将其他函数的结果存储在我的分页助手类中,但我的 Mocha 测试由于超时而失败,因为回调未返回。如果我从所有变量中删除 local (即 local.countcount),并删除保存回调的 .then 并将其放置在第一个 .then 中,它会突然起作用。

   render: (model, query, cb) =>
    self = @ 
    count = 0 
    local = {}

    count_promise = @query_count model, query

    count_promise.then (c) ->
      local.count = c 
      local.pages = self.pages(count)
      local.prev_class = self.prev_class(pages)
      local.next_class = self.next_class(pages)
      local.prev_page = self.prev_page(pages)
      local.next_page = self.next_page(pages)
    .then ->
      cb({num_pages: local.pages, current_page: self.page, prev_class: local.prev_class, next_class: local.next_class, prev_page: local.prev_page, next_page: local.next_page, results: {}})

    .fail (err) ->
      throw new Error(err)

    return

编辑

我在回调之前添加了 console.log 以查看是否有任何内容出现。

.then ->
      console.log local
      cb({num_pages: local.pages, current_page: self.page, prev_class: local.prev_class, next_class: local.next_class, prev_page: local.prev_page, next_page: local.next_page, results: {}})

什么也没发现。

使用 Sinon 和 Chai 断言针对此特定方法进行 Mocha 测试代码:

describe 'PaginationHelper', ->

  describe 'Pagination Helper Initializes', ->
    it 'accepts page', ->
      assert.ok(new PaginationHelper(2))

  describe 'method testing', ->

    describe 'render method', ->
        ph = new PaginationHelper(2)
        result = {}

        before (done) ->
          ph.render BlogModel, {}, (res) ->
            result = res
            done()

        it 'returns object', ->
          assert.isObject(result)

        it 'returns object with num_pages', ->
          assert.property(result, "num_pages")

        it 'returns object with current_page', ->
          assert.property(result, 'current_page')

        it 'returns object with prev_class', ->
          assert.property(result, 'prev_class')

        it 'returns object with next_class', ->
          assert.property(result, 'next_class')

        describe 'render output testing', ->
          result = undefined

          before (done) ->
            ph = new PaginationHelper(1)
            ph.render BlogModel, {}, (res) ->
              result = res
              done()

          it 'returns a number for num_pages', ->
            assert.isNumber(result.num_pages)

          it 'returns a number for current_page', ->
            assert.isNumber(result.current_page)

          it 'returns string for prev_class', ->
            assert.isString(result.prev_class)

          it 'returns string for next_class', ->
            assert.isString(result.next_class)

本次测试的结果输出:

Error: Command failed:   ✖ 1 of 35 tests failed:

  1) PaginationHelper method testing render method "before all" hook:
     Error: timeout of 2000ms exceeded

最佳答案

我发现了这个问题。直到我深入研究 Q promises API 之前,我才正确理解 thenables 的链接。重重。变量中也有一些愚蠢的错误我没有纠正。当 super 累的时候编码并不酷。代码应如下所示:

render: (model, query, cb) =>
    self = @  

    count_promise = @query_count model, query

    count_promise.fail (err) ->
      throw new Error(err)
    .then (c) ->
      defer = Q.defer()
      local = {}
      local.count = c 
      local.pages = self.pages(local.count)
      local.prev_class = self.prev_class(local.pages)
      local.next_class = self.next_class(local.pages)
      local.prev_page = self.prev_page(local.pages)
      local.next_page = self.next_page(local.pages)
      defer.resolve(local)
      return defer.promise
    .then (local) ->
      cb({num_pages: local.pages, current_page: self.page, prev_class: local.prev_class, next_class: local.next_class, prev_page: local.prev_page, next_page: local.next_page, results: {}})
    return

关于javascript - Node.js 中的对象字面量会阻塞吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12487545/

相关文章:

javascript - 从 Meteor.method 中的多个 promise 返回值

c# - 从异步方法返回 IEnumerable<T> 哪里出错了?

javascript - 等待用户事件

javascript - 如何正确克隆 JavaScript 对象?

javascript - 如何使用http 2实现cookie jar

sql-server - 在 Node.js 中防止 SQL 注入(inject)的最佳方法

c - Unix - 异步读取 (aio_read)

javascript - 我如何从这个字符串中获取数字?

javascript - 关闭元素或行号的外部 css

node.js - 无法在 heroku 上使用 node.js 连接到 mongolab