没有标准回调签名的Meteor wrapAsync或bindEnvironment

时间:2018-01-22 22:10:57

标签: meteor node-fibers

我试图在此npm包中调用createTableIfNotExists,并在Meteor,服务器端同步执行此操作。 https://www.npmjs.com/package/azure-storage

但是,回调签名的类型为function(error, result, response),而不是传统的function(error,result)

1)因此,我无法使用Meteor.wrapAsync而是必须使用Meteor.bindEnvironment

2)我打电话给' bindEnvironment'如下。注意带有3个参数的回调。这有效,但现在我想提取return value,回到原始方法(即原始光纤)。

请注意,只需定义' addResult' createTableService之外的内容不起作用,因为bindEnvironment内的回调相对于外部代码异步运行...即。 demoFunction()在回调设置addResult之前返回。

var demoFunction = function(){
    var addResult = null;
    var tableService = azure.createTableService(acctName, acctKey);
                    tableService.createTableIfNotExists(asTableName, Meteor.bindEnvironment(function(error,result,response){
                        if (error) {
                            throw new Meteor.Error(500, "table create error - " + asTableName + ": "+ error);
                        }
                        console.log(result);
                        if(result){
                            addResult = /*call to meteor method*/ 
                            return addResult;
                        }                   
                    }));

    return addResult; //this is what I would like to do, but will always be null, as written.

}

如何调用createTableIfNotExists并仍然将addResult 返回到调用 demoFunction()的函数?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用Futurenode-fibers)包中的fibers/future,这只是一个不同的光纤抽象层,因为this async/await implementationthis promise implementation是,  太。 (注意,直接使用光纤is not recommended)。

通用未来模式

正如您已经指出的那样,您也可以使用async / await或使用promises解决此问题。

但是,如果您想知道如何使用Future实例,则可以关注我在我的许多应用程序中使用的this popular pattern

Meteor.bindEnvironment的未来模式

bindEnvironment包含在此模式中,并稍微重构代码,如下所示:

import Future from 'fibers/future';

Meteor.methods({
    myMeteorMethod: function() {
        // load Future
        const myFuture = new Future();

        // create bound callback, that uses the future
        const boundCallback = Meteor.bindEnvironment(function (error,results){
            if(error){
              myFuture.throw(error);
            }else{
              myFuture.return(results);
            }
        });

        // call the function and pass bound callback
        SomeAsynchronousFunction("foo", boundCallback);

        return myFuture.wait();
    }
});

应用于代码示例

将此模式的修改应用于您的代码,可能会导致类似下面的代码。 请注意,由于可读性,我将回调与在函数内部创建分开。当然,您可以像在通常那样在函数头内创建它。

import Future from 'fibers/future';

var demoFunction = function(){
    // load Future
    const myFuture = new Future();

    // create bound callback, that uses the future
    const boundCallback = Meteor.bindEnvironment(function (error, result, response) {
        if (error) {
            myFuture.throw(new Meteor.Error(500, "table create error - " + asTableName + ": "+ error));
        }

        // do whatever you need to do here
        // with result and response...

        if (result) {
            myFuture.return(result);
        }                   
    });

    var tableService = azure.createTableService(acctName, acctKey);

    // pass the bound callback here
    tableService.createTableIfNotExists(asTableName, boundCallback);

    return myFuture.wait();

}