【发布时间】:2018-07-01 15:27:30
【问题描述】:
我试图在这个 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 提取回原始方法(即原始光纤)。
请注意,在createTableService 之外简单地定义“addResult”是行不通的,因为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()?
谢谢!
【问题讨论】:
-
使用
future应该可以。我 -
谢谢 - 你能详细说明一下吗?我对`future`一点也不熟悉。看着这个包npmjs.com/package/fibers,但不知道如何修改我上面的代码。 ====OR==== 从
demoFunction()返回一个Promise 也是一个选项吗?我比较熟悉使用async/await -
对不起,我在奔跑中的简短回答,我在家时会尽量给你一个更详细的答案。
-
实际上,从
demoFunction返回一个Promise,然后rejecting/resolving它在bindEnvironment 函数中起作用了......我没有意识到bindEnvironment会解决外部Promise ......虽然现在它以它的名字继承外部环境是有道理的:) =====>>>> 如果可能的话,我仍然希望看到一个Future解决方案,它可以通过创建来启用任意数量的异步调用与demoFunction()光纤同步,因为我以后可能会需要它。
标签: meteor node-fibers