我编写了一个正确返回数据但未正确处理错误的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"服务器控制台中的消息,但最终也会卡住。所以我不清楚它是客户端还是服务器问题(我怀疑是服务器)。
有谁知道原因:
我在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);
});
答案 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');
});
};