我试图在异步函数中使用“await”,以避免回调。没有错误,但方法调用后的代码行会立即执行,并且不会提取方法的返回值。
我正在使用React,但我认为这不会影响此代码。我假设async和await命令是由babel运行时提供的,所以我不需要手动包含任何其他命令?我已经阅读了许多示例和教程,并尝试了许多变体,但都没有成功。我一定错过了一些基本的东西,但我想不出来。
服务器:
Meteor.methods({
'asyncTest': function() {
setTimeout(() => {return 'cheese';}, 2000);
}
});
客户:
Meteor.myFunctions = {
'test': async function Test() {
let result1 = await (Meteor.call('asyncTest'));
console.log(`got result ${result1}`);
},
};
当我跑步时
Meteor.myFunctions.test()
在浏览器控制台中,我立即看到以下输出:
Promise { "pending" }
<state>: "pending"
__proto__: PromiseProto { done: common.js/exports.Promise.prototype.done(), ⦠}
got result undefined
没有错误,但显然不起作用;应该有两秒钟的延迟,应该是“得到结果奶酪”。
我还尝试了以下服务器代码:
import { Promise } from 'meteor/promise';
Meteor.methods({
'asyncTest': function() {
return new Promise(resolve => {
setTimeout(() => {console.log('cheese'); resolve('cheese');}, 2000);
});
},
});
这也行不通。
感谢您的帮助。
版本:
METEOR@1.6.0.1
babel运行时@^6.26.0
react@16.2.0
编辑2:我得到了@Tolsee的建议:)除此之外,我在测试方法中犯了一个愚蠢的错误,使用setTimeout延迟返回。当然,这不起作用,因为超时结束时调用的函数不是方法。此代码适用于我:
服务器:
Meteor.methods({
'asyncTest': function() {
var timeNow = new Date();
while (new Date().getSeconds() < timeNow.getSeconds() + 3) {
}
return 'cheese';
},
});
客户:
success = function(res) {
console.log('result ' + res);
}
failure = function(err) {
console.log('failure ' + err);
}
promisedCall = function(method) {
return new Promise((resolve, reject) => {
Meteor.call(method, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
在控制台中运行以下代码:
promisedCall('asyncTest').then(success, failure);
如预期的那样,有3秒的延迟,然后
result cheese
出现在控制台中。
非常感谢。