2017-04-06 52 views
0

我写了一个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”消息,但最终也卡住了。所以我不清楚,如果这是一个客户端或服务器问题(我怀疑服务器)。

没有人知道为什么:

  1. 我没有看到从拒绝承诺路径中的任何回报,
  2. 为什么打这条路打破了方法前进?

我是在流星v1.4.3.2

更新

我也试图捕捉语法,但行为是一样的:

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

你试过'throw',而不是对未来'reject'? –

+0

@MaxG。是的,结果相同。这个问题是以某种方式承诺的,而不是未来。因为我的例子是同步的,作为一个测试我拿出了承诺,并用错误条件抛出。它按预期工作。 – zim

+0

fwiw,如果我不在承诺中使用reject(),并且只是从承诺中“抛出新的Meteor.Error”,那么它一切正常。感觉很脏。我希望拒绝工作,所以请保持开放。 – zim

回答

0

我有升级到流星1.4.4.2,我无法再现这个问题。

和fwiw,我还发现,不像我以前使用过的$ q库,在ES6诺言上调用reject(),不是退出函数。它会很高兴地继续运行,并且在我上面的例子中,还调用了resolve()。这可能会让这个以前版本的Meteor产生混淆。

所以现在我这样做是为了确保我退出上的任何解析函数()或拒绝():

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'); 
    }); 
};