Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor wrapAsync同步执行,但从不返回_Javascript_Node.js_Asynchronous_Meteor - Fatal编程技术网

Javascript Meteor 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函数 一切似乎都很好。。。请求调用以正确的结果响应,调用了最终的回调,整个过程同步执行/就我所知正确生成。。。但是

我试图用wrapAsync包装节点包中的函数

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, {});

谢谢你。我这方面的愚蠢疏忽。当系统允许的时候,我会回来奖励赏金。干杯