NodeJS承诺使用rethinkDB

时间:2018-02-24 18:54:01

标签: node.js rethinkdb rethinkdbdash

使用Rethindb时,我对nodeJS中的promises有疑问。 这段代码将首次向我提供db的结果,而不是更多。

让我说我启动脚本并向数据库添加一行,新数据将以cmd格式打印。但是,如果我添加另一个,则不显示任何内容。我使用承诺的方式出了什么问题? (不,我不想使用回调)

THX!

PushData(r, table)
.then(res=>{
  console.log(res);
}


function PushData(r, table){
  return new Promise(function(resolve, reject){
    r.table(table)
    .changes()
    .run()
    .then(function(cursor){

      cursor.on("error", function(err) {
        reject(err)
      })
      cursor.on("data", function(data) {
        resolve(data);
      })
    });
  });
}

3 个答案:

答案 0 :(得分:0)

是的,你正在将“承诺”与“回调”混为一谈。承诺的一个基本原则是它只能在一天完成。在解决或拒绝之后(可以通过两种方式实现),它无法再次操作。

回调不是邪恶的。现在是时候使用它们了。

答案 1 :(得分:0)

承诺只解析为一个值,并且在承诺上多次调用resolve()每次都会返回该值。那不是你想要的。

你要做的是反复拨打cursor.next()以获得更多价值,一个接一个的承诺。

但是,您可能也对ES6的另一个类似功能感兴趣:Asynchronous Iterator

这是我将游标从rethinkdb转换为异步迭代器的代码:

import { $$asyncIterator } from 'iterall'

// Transform the cursor's stream into an Async Iterator.
function feedToAsyncIterator (p) {
  return {
    next () {
      return p.then(async cursor => {
        try {
          // See https://www.rethinkdb.com/api/javascript/next/
          const row = await cursor.next()
          return {value: row, done: false}
        }
        catch (e) {
          return {done: true}
        }
      })
    },
    [$$asyncIterator]() {
      return this
    }
  }
}

const myChangeFeed = r.table('myTable').changes().run(db)

// You can enumerate the changes from inside an async function this way:
for await (const change of feedToAsyncIterator(myChangeFeed)) {
  console.log('change:', change)
}

答案 2 :(得分:0)

我的理解是您有一个异步函数,要调用两次。例如,要向数据库插入两行,将调用该函数两次。

const PushData = async (r, table) => {
    try {
        const res = await new Promise(function (resolve, reject) {
            r.table(table)
                .changes()
                .run()
                .then(function (cursor) {

                    cursor.on("error", function (err) {
                        reject(err)
                    })
                    cursor.on("data", function (data) {
                        resolve(data);
                    })
                });
        });
        return res
    } catch (error) {
        throw error
    }
}

var res1 = await PushData(r,table)
console.log("result 1 is ==> "+res1)
var res2 = await PushData(r,table)
console.log("result 2 is ==> "+res2)