gpt4 book ai didi

Node.js 同步返回多个异步yield结果

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:34 26 4
gpt4 key购买 nike

我正在将 rethinkDB 与 Node.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 结果的已完成结果?

最佳答案

yield 不适用于包含 Promise 的对象 - 它仅适用于 Promise 本身。而不是 returnield {q1: query, q2: query2}; 你必须这样做

return {q1: yield query, q2: yield query2};

但是,这有点问题,因为在 query 完成之前不会抛出 query2 中的错误。所以如果你不这样做just want to sequentially execute them ,您将必须使用 Promise.all 来“并行”等待一组 Promise:

var [q1, q2] = yield Promise.all([query, query2]);
return {q1, q2};

(根据您使用的 Promise 库,可能还有一个辅助函数将对象视为集合,而不仅仅是数组)

关于Node.js 同步返回多个异步yield结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com