使用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);
})
});
});
}
答案 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)