Javascript Meteor wrapAsync同步执行,但从不返回
我试图用wrapAsync包装节点包中的函数Javascript Meteor wrapAsync同步执行,但从不返回,javascript,node.js,asynchronous,meteor,Javascript,Node.js,Asynchronous,Meteor,我试图用wrapAsync包装节点包中的函数 filepicker = new Filepicker('API Key') filepickerStatSync = Meteor.wrapAsync(filepicker.stat, filepicker) result = filepickerStatSync(url); console.log('after') 下面是stat函数 一切似乎都很好。。。请求调用以正确的结果响应,调用了最终的回调,整个过程同步执行/就我所知正确生成。。。但是
filepicker = new Filepicker('API Key')
filepickerStatSync = Meteor.wrapAsync(filepicker.stat, filepicker)
result = filepickerStatSync(url);
console.log('after')
下面是stat函数
一切似乎都很好。。。请求调用以正确的结果响应,调用了最终的回调,整个过程同步执行/就我所知正确生成。。。但是sync调用永远不会返回,并且console.log('after')永远不会被命中
我不认为我犯了与此相同的错误,因为我的函数有一个回调作为最后一个参数
我也不认为解决方案是这样的,因为包装函数最终会调用带有错误和结果的回调,这应该是Meteor.wrapAsync在签名中寻找的
Filepicker.prototype.stat = function(url, options, callback) {
callback = callback || function(){};
if(!options) {
options = {};
}
if(!url) {
callback(new Error('Error: no url given'));
return;
}
request({
method: 'GET',
url: url+'/metadata?',
form: {
size: options.size || true,
mimetype: options.mimetype || true,
filename: options.filename || true,
width: options.width || true,
height: options.height || true,
writeable: options.writeable || true,
md5: options.md5 || true,
path: options.path || true,
container: options.container || true,
security: options.security || {}
}
}, function(err, res, body) {
console.log('err = '+err);
console.log('res = '+res);
console.log('body = '+body);
if(err) {
callback(err);
return;
}
var returnJson;
if(typeof(body)==='string'){
try {
returnJson = JSON.parse(body);
} catch(e) {
callback(new Error('Unknown response'), null, body);
return;
}
} else {
console.log('returnJSON');
returnJson = body;
}
console.log('callbacked');
callback(null, returnJson);
});
};
您正在包装的函数有三个参数,但您只提供了两个:
url
,以及(隐式地)回调函数(我将其称为cb
)。因此,在内部执行的是Filepicker.prototype.stat(url,cb)
,即回调函数cb
将被解释为选项,而不是回调
,并且回调
将被设置为空函数。因此永远不会调用wrapAsync的回调,因为回调链已断开
这应该起作用:
result = filepickerStatSync(url, {});
谢谢你。我这方面的愚蠢疏忽。当系统允许的时候,我会回来奖励赏金。干杯