我写了一个Meteor方法,正确返回数据但没有正确处理错误。该方法本身使用Future,并调用使用ES6承诺的效用函数。MeteorJS承诺拒绝通过未来不按预期工作
我从浏览器控制台调用该方法。 “开心路径”按预期工作,我可以在浏览器中输出我的结果。错误路径不会回来。
这里是方法:
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};
这里我称它在浏览器(Chrome上OSX):
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
通知我在快乐的道路上称它为3倍,而在不快乐的道路上1倍。不幸的路径永远不会回来。
,如果我用的开心路径再次调用它,出现这种情况:
Meteor.call('foo', 1, function(e,r) {console.log('e:', e); console.log('r:', r);})
undefined
现在到一定的缓冲某处被清除出它的“卡壳”。我可以通过重新加载浏览器来清除它。
如果我一直打不开的路径,我将看到服务器控制台中的一些“nope”消息,但最终也卡住了。所以我不清楚,如果这是一个客户端或服务器问题(我怀疑服务器)。
没有人知道为什么:
- 我没有看到从拒绝承诺路径中的任何回报,
- 为什么打这条路打破了方法前进?
我是在流星v1.4.3.2
更新:
我也试图捕捉语法,但行为是一样的:
bar(num).then(result => {
console.log('result:', result);
future.return(result);
}).catch(error => {
console.log('error:', error);
future.throw(error);
});
你试过'throw',而不是对未来'reject'? –
@MaxG。是的,结果相同。这个问题是以某种方式承诺的,而不是未来。因为我的例子是同步的,作为一个测试我拿出了承诺,并用错误条件抛出。它按预期工作。 – zim
fwiw,如果我不在承诺中使用reject(),并且只是从承诺中“抛出新的Meteor.Error”,那么它一切正常。感觉很脏。我希望拒绝工作,所以请保持开放。 – zim