未来在节点中运行一系列asynchronousfunction需要什么地方?

以前,我使用future.wait()等待一个值,然后再return到下一个函数。 (我正在编写meteor的方式)

在读取节点的非阻塞I / O体系结构之后 ,我的下面的方法(它是否工作)完全失败了目的?

我正在做的是将下面的“请求”函数的返回结果传递给另一个函数。 相反,callback方法是最好的约定?

为什么我使用未来的唯一原因是因为使用return立即执行。 我想学习最好的做法,因为我认为我将来会增加额外的不必要的代码层。

如果我使用callback约定, callback(null, result) ,'callback'是否等待对象传递给参数?

我的代码使用未来等待结果:

 function requesting(perm_data) { var f = new future(); request.get('example.com/api/auth_user', { oauth: {consumer_key:'somekey', token: perm_data.oauth_token, token_secret: perm_data.oauth_token_secret } }, function response(error, response, body) { if (!error && response.statusCode === 200) { var bodyToJson = parser.toJson(body, options) var userId = bodyToJson.user.id return f.return(userId) } else { f.throw(error) } }) return f.wait() } function nextFunction(data) { //do some thing with data } Meteor.methods({ sequenceAsyncFunctions: function() { try { var resultOne = requesting() var resultTwo = nextFuntion(resultOne) } catch (e) { //handling my errors } } }) 

我注意到你标记这个问题meteor 。 Meteor在服务器上使用Fibers 。 这个软件包为您提供合作多任务使用一种轻量级的线程(称为光纤)。 这允许你像写requesting一样写“阻塞”函数,而不用实际阻塞事件循环。 Future可以让你使用Fibers以阻塞的方式使用基于callback的node.js函数。

如果没有Fibre,就不可能编写像I / O requesting那样的函数,并直接返回结果。 相反,你必须传递callback(或使用承诺)。

meteor飞行代码应该利用服务器上的光纤来实现“阻塞”function。 核心Meteor API是如何工作的,而Meteor方法则是必须的。 而不是使用future ,你可能会发现Meteor.wrapAsync更方便。

在常规的node.js代码中,您可以使用Fibers,但是使用function (err, result) {...}callback或promise可能更常见。 在浏览器中(包括meteor客户端代码),你不能使用光纤,所以你必须使用callback或承诺。

以下是您将如何使用future定期callback和承诺对操作进行sorting:

 // Future function doTwoThings() { var future = new Future(); asyncFunction(argument, function (err, result) { if (err) future.throw(err); else future.return(result); }); var result = future.wait(); var future2 = new Future(); anotherAsyncFunction(result, function (err, result2) { if (err) future2.throw(err); else future2.return(result2); }); var result2 = future2.wait(); return result2 + 2; } // wrapAsync var wrappedAsyncFunction = Meteor.wrapAsync(asyncFunction); var wrappedAnotherAsyncFunction = Meteor.wrapAsync(anotherAsyncFunction); function doTwoThings() { var result = wrappedAsyncFunction(argument); var result2 = wrappedAnotherAsyncFunction(anotherAsyncFunction); return result2 + 2; } // Regular callbacks function doTwoThings(callback) { asyncFunction(argument, function (err, result) { if (err) return callback(err); anotherAsyncFunction(result, function (err, result2) { if (err) return callback(err); callback(null, result2 + 2); }); }); } // Promises function doTwoThings() { return asyncFunctionReturningPromise(argument).then(function (result) { return anotherAsyncFunctionReturningPromise(result); }).then(function (result2) { return result2 + 2; }); } 

'callback'等待对象传递给参数

实际上callback并不等待对象。 callback是通过你给它的参数有参数的参数来调用的。


您可以使用Q之类的承诺库来处理这个问题

这里有一些文章更深入地描述它

一些替代品是Kew和Async 。

承诺已经明确,你可以在这里看到更多的细节和库: http : //wiki.commonjs.org/wiki/Promises/A

Interesting Posts