MeteorJS承诺通过未来拒绝不按预期工作

时间:2017-04-06 16:17:50

标签: meteor es6-promise

我编写了一个正确返回数据但未正确处理错误的Meteor方法。方法本身使用Future,并调用使用ES6 promise的实用程序函数。

我从浏览器控制台调用该方法。 "快乐的道路"按预期工作,我可以在浏览器中调用我的结果console.log()。错误路径没有回来。

这是方法:

import {bar} from './bar';

const Future = Npm.require('fibers/future');

Meteor.methods({
    'foo': function(num) {
        check(num, Number);

        let future = new Future();

        bar(num).then(function(result) {
            future.return(result);
        }, function(error) {
            future.throw(error);
        });

        return future.wait();
    }
});

这是实用程序:

const bar = function(num) {
    return new Promise((resolve, reject) => {

        if (num === 3) {
            let msg = 'nope';
            console.error(msg);
            reject(msg);
        }

        resolve('good');
    });
};

export {bar};

这是我在浏览器中调用它(OSX上的Chrome):

Meteor.call('foo', 1, function(e,r) {console.log('e:', e);  console.log('r:', r);})
undefined
VM771:1 e: undefined
VM771:1 r: good
Meteor.call('foo', 1, function(e,r) {console.log('e:', e);  console.log('r:', r);})
undefined
VM773:1 e: undefined
VM773:1 r: good
Meteor.call('foo', 1, function(e,r) {console.log('e:', e);  console.log('r:', r);})
undefined
VM775:1 e: undefined
VM775:1 r: good
Meteor.call('foo', 3, function(e,r) {console.log('e:', e);  console.log('r:', r);})
undefined

注意我在快乐的路径上称它为3x,在不快乐的路径上称它为1x。不愉快的道路永远不会回来。

如果我再次以愉快的方式称呼它,就会发生这种情况:

Meteor.call('foo', 1, function(e,r) {console.log('e:', e);  console.log('r:', r);})
undefined

现在它已经卡住了#34;直到某个缓冲区被清除。我可以通过重新加载浏览器来清除它。

如果我继续打不开路,我看到一些" nope"服务器控制台中的消息,但最终也会卡住。所以我不清楚它是客户端还是服务器问题(我怀疑是服务器)。

有谁知道原因:

  1. 我没有看到来自被拒绝的承诺路径的任何回复,
  2. 为什么击中那条路会打破这种方法呢?
  3. 我在Meteor v1.4.3.2

    更新

    我也尝试了catch语法,但行为是一样的:

        bar(num).then(result => {
            console.log('result:', result);
            future.return(result);
        }).catch(error => {
            console.log('error:', error);
            future.throw(error);
        });
    

1 个答案:

答案 0 :(得分:0)

我已升级到Meteor 1.4.4.2,我无法重现此问题。

和fwiw,我还发现,与我过去使用的$ q库不同,在ES6承诺上调用reject()会退出该函数。它会愉快地继续运行,在上面的例子中,也调用resolve()。这可能会让以前版本的Meteor中出现混淆。

所以现在我这样做是为了确保我在任何resolve()或reject()上退出函数:

const bar = function(num) {
    return new Promise((resolve, reject) => {

        if (num === 3) {
            let msg = 'nope';
            console.error(msg);
            return reject(msg);
            //console.log('omg why am i here');
        }

        return resolve('good');
    });
};