纤维/未来实际上做了啥?

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() 本身并不会结束执行。

以上是关于纤维/未来实际上做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

调用 Tk() 实际上做了啥?

标准“安装”实际上做了啥?

Apache Mesos 实际上做了啥?

Firebase 观察者实际上做了啥?

SecurityInterstitialCommandId.CMD_PROCEED 实际上做了啥?

Android SQLite - SQLiteDatabase.replace() 实际上做了啥?