【问题标题】: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 变量是什么?

【问题讨论】:

  • 都是关于回调和承诺的。它允许您同步运行异步代码。

标签: node.js meteor npm node-fibers


【解决方案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() 本身并不会结束执行。
猜你喜欢
  • 2013-06-02
  • 2020-11-21
  • 2015-02-26
  • 2017-06-29
  • 2013-06-13
  • 2021-10-25
  • 2011-08-12
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多