gpt4 book ai didi

javascript - wrapAsync 返回函数而不是结果

转载 作者:行者123 更新时间:2023-12-01 02:14:13 25 4
gpt4 key购买 nike

好吧,菜鸟来了。仍在学习。我不明白如何让我的方法将 Meteor.wrapAsync 函数的结果返回到客户端上的 Meteor.call。我的方法中的 console.log(companies); 生成一个函数,而不是结果。我在这里不明白什么?

路径:client.jsx

Meteor.call('getTop100ASX', (error, result) => {
console.log(result);
});

路径:method.js

Meteor.methods({
'getTop100ASX'() {
const aggregateFunc = db.collection('companiesASX').aggregate([{
$group: {
_id: {
location: "$google_maps.geometry_location"
},
companies: {
$addToSet: {
name: "$company_name"
}
}
}
}]).toArray((err, result) => {
return result;
});

const companies = Meteor.wrapAsync(aggregateFunc);

console.log(companies);

return companies;
},
});

最佳答案

wrapAsync包装一个通常需要回调的函数,并可以利用fibers以同步方式在服务器上调用该包装函数。 (即接受一个函数+上下文并返回一个函数)。

它无法获取某些值并神奇地从中提取预期结果(即,在您的示例中,从 result 回调中提取 toArray )。

你给它的不是一个函数,而是一个Promise对象(从调用 toArray 返回)。

由于它已经返回了一个 promise ,因此您有多种选择:

更简单的方法是返回该 Promise(并且不需要 toArray() 中的回调),因为如果 Meteor 方法返回 Promise,服务器将等待 Promise 解析,然后将结果返回给客户端。

Meteor.methods({
'getTop100ASX'() {
return db.collection('companiesASX').aggregate([...]).toArray();
},
});

如果需要进一步处理companies在该方法中,您可以使用 async/await,例如:

Meteor.methods({
async 'getTop100ASX'() {
const companies = await db.collection('companiesASX').aggregate([{
$group: {
_id: {
location: "$google_maps.geometry_location"
},
companies: {
$addToSet: {
name: "$company_name"
}
}
}
}]).toArray();

let someResult = sumeFunc(companies);

return someResult;
},
});

为了完整起见,为了使用wrapAsync ,您应该提供 toArray方法和上下文如下所示:

Meteor.methods({
'getTop100ASX'() {
const cursor = db.collection('companiesASX').aggregate([{
$group: {
_id: {
location: "$google_maps.geometry_location"
},
companies: {
$addToSet: {
name: "$company_name"
}
}
}
}]);

// wrap the cursor's `toArray` method and preservs the context
const syncToArray = Meteor.wrapAsync(cursor.toArray, cursor);

// and call the wrapped function in a sync manner
const companies = syncToArray();

return companies;
},
});

关于javascript - wrapAsync 返回函数而不是结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49571978/

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