我正在尝试在异步函数中使用'await'以避免回调。没有错误,但是方法调用之后的代码行立即执行,并且没有拾取方法的返回值。
我正在使用React,但我认为这不会影响此代码。我假设babel-runtime提供了async和await命令,所以我不需要手动包含任何其他内容?我已经阅读了很多示例和教程,并尝试了很多变化,但没有成功。我必须遗漏一些非常基本的东西,但我无法弄明白。
服务器:
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-runtime@^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
出现在控制台中。
谢谢!
答案 0 :(得分:0)
首先,async-await
由javascript提供,而不是babel。
在async
函数中,您可以await
暂停该函数,直到Promise
被解析。因此,await
不能与Meteor.call
一起使用,Promise
不会返回Meteor.myFunctions = {
'test': async function Test() {
let result1 = await (Meteor.call('asyncTest')); // Bucause Meteor.call does not return promise.
console.log(`got result ${result1}`);
},
};
。
现在,让我们来看看您的代码:
首个客户代码:
Promise
我不知道你在第二个例子中想要做什么。如果您认为当您在方法中返回promise时,客户端将获得function promisedCall(method) {
return new Promise((resolve, reject) => {
Meteor.call(method, (err, res) => {
if (err) {
reject(err)
} else {
resolve(res)
}
});
}
,这是错误的想法。承诺在服务器中得到解决,数据被传递回客户端,因此从客户的角度来看,它没有任何区别。
您想使用此库:https://github.com/deanius/meteor-promise
编辑: 您可以自己创建一个简单的承诺方法调用函数。
{{1}}