等待Meteor / React项目不起作用

时间:2018-02-22 15:30:09

标签: meteor async-await

我正在尝试在异步函数中使用'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出现在控制台中。

谢谢!

1 个答案:

答案 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}}