Node.js 将API所需的回调转换为同步样式

Node.js 将API所需的回调转换为同步样式,node.js,asynchronous,meteor,callback,kurento,Node.js,Asynchronous,Meteor,Callback,Kurento,我正在尝试将kurento与Meteor结合起来。我在将Node.JS的嵌套回调转换为正确的Meteor服务器代码时遇到了问题。 下面是我试图使用Meteor.wrapAsync转换的代码: kurento(args.ws_uri, function(error, client) { if ( error ) return onError(error); client.create('MediaPipeline', function(error, pipeline) { if

我正在尝试将kurento与Meteor结合起来。我在将Node.JS的嵌套回调转换为正确的Meteor服务器代码时遇到了问题。
下面是我试图使用Meteor.wrapAsync转换的代码:

kurento(args.ws_uri, function(error, client) {
  if ( error ) return onError(error);

  client.create('MediaPipeline', function(error, pipeline) {
    if ( error ) return onError(error);

    console.log("Got MediaPipeline");

    pipeline.create('RecorderEndpoint', { uri : file_uri }, function(error, recorder) {
      if ( error ) return onError(error);

      console.log("Got RecorderEndpoint");

      pipeline.create('WebRtcEndpoint', function(error, webRtc) {
        if ( error ) return onError(error);

        console.log("Got WebRtcEndpoint");

        webRtc.connect(recorder, function(error) {
          if ( error ) return onError(error);

          console.log("Connected");

          recorder.record(function(error) {
            if ( error ) return onError(error);

            console.log("record");

            webRtc.connect(webRtc, function(error) {
              if ( error ) return onError(error);

              console.log("Second connect");
            });

            webRtc.processOffer(offer, function(error, answer) {
              if ( error ) return onError(error);

              console.log("offer");

              return answer;
            });
          });
        });
      });
    });
  });
});
我正试图在meteor服务器中使用wrapAsync编写它,如下所示

client = Meteor.wrapAsync(kurento,ws_uri);
//client = Meteor.wrapAsync(getKurentoClient);
console.log("got connected to server");

pipeline = Meteor.wrapAsync(client.create,'MediaPipeline');
console.log("Got MediaPipeline");

var webRtc = Meteor.wrapAsync(pipeline.create,'WebRtcEndpoint');
console.log("Got WebRtcEndpoint");

var recorder = Meteor.wrapAsync(pipeline.create,('RecorderEndpoint', {uri: file_uri}));
console.log("Got RecorderEndpoint");

Meteor.wrapAsync(webRtc.connect,recorder);
console.log("Connected recorder");

Meteor.wrapAsync(webRtc.connect,webRtc);
console.log("Connected webRtc");

Meteor.wrapAsync(recorder.record);
console.log("started recording");

var sdpAnswer = Meteor.wrapAsync(webRtc.processOffer,offer);
console.log("sdpAnswer"+sdpAnswer());
return sdpAnswer;
每当我尝试这样做时,我都会得到一个函数作为输出,而不是对象!。下面是我最后一次看到sdpanswer的concole log语句的输出

调用方法“onOffer”TypeError时出现异常:无法调用未定义的方法“apply”
I20150722-19:10:15.185(5.5)?在packages/meteor/helpers.js:118:1
I20150722-19:10:15.186(5.5)?位于[object object].Meteor.methods.onOffer(app/absimpl.js:90:31)
I20150722-19:10:15.186(5.5)?在MaybauditArgumentChecks(packages/ddp/livedata_server.js:1617:1)
I20150722-19:10:15.186(5.5)?在packages/ddp/livedata_server.js:648:1
I20150722-19:10:15.186(5.5)?在[object object].\u.extend.withValue(packages/meteor/dynamics\u nodejs.js:56:1)
I20150722-19:10:15.186(5.5)?在packages/ddp/livedata_server.js:647:1
I20150722-19:10:15.186(5.5)?在[object object].\u.extend.withValue(packages/meteor/dynamics\u nodejs.js:56:1)
I20150722-19:10:15.186(5.5)?在[object object].\uu.extend.protocol\u handlers.method(packages/ddp/livedata\u server.js:646:1)
I20150722-19:10:15.186(5.5)?在packages/ddp/livedata_server.js:546:1


如何使用Meteor.wrapAsync将回调地狱正确地转换为一个好的同步函数?

每个回调需要两行代码,您试图同时声明和调用。()

第一行是创建一个同步呼叫。第二行是调用同步调用

clientSync = Meteor.wrapAsync(client.create, client);
pipeline = clientSync('MediaPipeline');

请注意,我没有使用kurento,因此无法详细说明,但对于一般的wrapAsync布局,这是您想要的。

非常感谢@Matt K。您的解决方案解决了我的问题。