纤维/未来实际上做了啥?
Posted
技术标签:
【中文标题】纤维/未来实际上做了啥?【英文标题】:What do fibers/future actually do?纤维/未来实际上做了什么? 【发布时间】:2016-08-06 21:16:22 【问题描述】:下面这行代码是做什么的?
Npm.require('fibers/future');
我在网上找了一些例子,我遇到了一些这样的例子:
Future = Npm.require('fibers/future');
var accessToken = new Future();
在这种情况下,accessToken
变量是什么?
【问题讨论】:
都是关于回调和承诺的。它允许您同步运行异步代码。 【参考方案1】:问题有点老了,但我的 2 美分:
正如 Molda 在评论中所说,Future 的主要目的是让异步事物同步工作。
future
实例自带3个方法:
future.wait()
基本上告诉你的线程基本上暂停,直到被告知恢复。
future.return(value)
,第一种告诉等待 future
他可以恢复的方法,它也非常有用,因为它返回一个值 wait 然后可以分配,因此像 const ret = future.wait()
这样的行,其中 ret 成为您恢复后的返回值。
future.throw(error)
,也非常明确,使您的阻塞行抛出给定错误。
在 javascript 中使事物同步可能听起来有点令人不安,但它有时很有用。在Meteor
中,当您在Meteor.method
中链接异步调用并且希望将其结果返回给客户端时,它非常有用。您也可以使用Promises
,现在Meteor
也完全支持它,我都使用过,而且效果很好,这取决于您的喜好。
一个简单的例子:
Meteor.methods(
foo: function()
const future = new Future();
someAsyncCall(foo, function bar(error, result)
if (error) future.throw(error);
future.return(result);
);
// Execution is paused until callback arrives
const ret = future.wait(); // Wait on future not Future
return ret;
);
【讨论】:
我在使用“投掷”时遇到了问题,看到一条消息“未来解决了不止一次”。我认为,future.throw 虽然解决了回调,但它不会停止执行。见这里:npmjs.com/package/fibers。像“if (error) future.throw(error) else future.return(result)”这样的结构应该更安全。 我不确定,但我认为 future.return 也不会停止执行。 你需要确保你的future只抛出和返回一次。最好的做法是始终使用return future.throw()
,因为 throw()/return() 本身并不会结束执行。以上是关于纤维/未来实际上做了啥?的主要内容,如果未能解决你的问题,请参考以下文章