我试图在此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()
的函数?
谢谢!
答案 0 :(得分:0)
您可以使用Future
(node-fibers)包中的fibers/future
,这只是一个不同的光纤抽象层,因为this async/await implementation或this promise implementation是,
太。 (注意,直接使用光纤is not recommended)。
正如您已经指出的那样,您也可以使用async / await或使用promises解决此问题。
但是,如果您想知道如何使用Future
实例,则可以关注我在我的许多应用程序中使用的this popular pattern。
将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();
}