我正在使用带有节点的数据库。js。以下请求可以正常工作:
function myFn () {
return co(function *() {
let query;
query = yield r.db("my-db")
.table("app")
.filter(r.row("id").eq(id))
.run(conn);
return query.toArray();
});
}
我想异步返回多个yield
的结果,但以下操作失败:
function myFn () {
return co(function *() {
let query, query2;
query = r.db("my-db")
.table("app")
.filter(r.row("id").eq(id))
.run(conn);
query2 = r.db("my-db")
.table("app")
.filter(...)
.run(conn);
return yield {q1 : query, q2 : query2};
});
}
然后我必须在每个元素上调用toArray()
,所以在调用函数时:
// using ramda.js
var res = R.map((el) => {
return el.toArray();
}, yield myFn);
然而我得到:
{
"q1": {
"isFulfilled": false,
"isRejected": false
},
"q2": {
"isFulfilled": false,
"isRejected": false
}
}
还有点奇怪:
// this works perfectly
return q.toArray();
// this returns the following :
return {q: q.toArray()};
"q": {
"isFulfilled": true,
"isRejected": false,
"fulfillmentValue": [ ... ]
}
我怀疑我遗漏了yield
的工作方式,那么如何返回多个yield
结果的已实现结果呢?
所以我在谷歌群组上问了同样的问题:
引用瑞安·保罗的话:
你最初的尝试实际上非常接近,只有两件事你需要补充:
下面是一个协同程序和产量的工作示例:
function myFn() {
return co(function*() {
var conn = yield r.connect();
var query1 = yield r.db("test").table("fellowship")
.filter({species: "hobbit"})
.coerceTo("array").run(conn);
var query2 = yield r.db("test").table("fellowship")
.filter({species: "human"})
.coerceTo("array").run(conn);
conn.close();
return {q1: query1, q2: query2};
});
}
只要使用像bluebird这样的promise库,在没有协同程序和产量的情况下也非常简单。我会这样做:
function myFn1() {
return r.connect().then(conn => {
return bluebird.all([
r.db("test").table("fellowship")
.filter({species: "hobbit"})
.coerceTo("array").run(conn),
r.db("test").table("fellowship")
.filter({species: "human"})
.coerceTo("array").run(conn)
]).then(items => ({q1: items[0], q2: items[1]}));
});
}
屈服
不适用于包含promise的对象-它只适用于promise本身。而不是返回屈服{q1:查询,q2: query2};
return {q1: yield query, q2: yield query2};
然而,这有点问题,因为在query2
中的错误在query
完成之前不会被抛出。所以,如果你不只是想按顺序执行它们,你必须使用Promise。所有
“并行”等待一系列promise:
var [q1, q2] = yield Promise.all([query, query2]);
return {q1, q2};
(根据您使用的promise库的不同,可能还有一个helper函数将对象视为集合,而不仅仅是数组)
问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:
问题内容: 我正在使用nodejs通过Mongoose从Mongodb查询数据。获取数据后,我想对该数据做一些处理,然后再将其响应给客户端。但是我无法获得返回值。在Google上浏览后,我了解到Node.js函数是异步javascript函数(非I / O阻止)。我尝试了这个Tut( 问题答案: 获得未定义值的原因是因为find函数是异步的,并且可以随时完成。在您的情况下,使用后就结束了,因此在访
从tornado.gen模块文档中我了解到,tornado.gen.Task由tornado.gen.Callback和tornado.gen.Wait组成,每个Callback/Wait对与唯一键关联。。。 因此,上面的代码将从不同的URL获取所有响应。现在我真正需要完成的是在一个http_客户端返回数据时立即返回响应。因此,如果“tornadweb.org”首先返回数据,它应该执行self.w
问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情
问题内容: 我对如何在Mocha测试中包装嵌套的异步回调感到困惑。这是令人讨厌的代码示例:正在调用Amazon S3以检查文件是否存在: 代码挂起等待完成(如果我省略done())-或者,代码完成而没有回调,或者,节点抱怨done()被多次调用。 在下面的帮助下,我可以正常工作了,但看起来像是异步伏都炖菜 问题答案: 尝试使用async.serial。在第一个条目内,使用async.each运行多
问题内容: 我是nodejs的新手,正在编写一些查询MySQL数据库并从给定的user_id返回用户名的代码。我一直在阅读,您所有的功能都应该是异步的。在这种情况下,理想情况下,我希望服务器能够在进行此查询时响应其他事件请求。但是,这不是一个特别大的查询,只返回一个值。也许我应该使其同步?(如果这是您的答案,那么更改示例代码将是不错的选择)无论如何,这是我的功能。它在最后一行“ return cu