JavaScript 原生纤维
JavaScript native fibers
您知道 JavaScript 的未来版本是否计划支持原生光纤吗?确实,如果可以这样写就太酷了:
console.log("sleep 3s...");
const value = wait (resolve, reject) => {
setTimeout(
() => resolve(5),
3_000
);
};
console.log("value =", value); // value = 5 (after 3s)
当然,使用 async/await
可能会得到类似的结果,但是纤程允许您在代码中的任何地方暂停,而不必在声明为 async
.[=18 的函数中=]
事实上,将同步函数转换为异步函数会变得非常有问题,因为有必要转换级联中的所有依赖项:
const a = () => b() + 1;
const b = () => c() + 2;
const c = () => 5;
const value = a();
好的,现在 c 变成了异步...
const a = async () => (await b()) + 1;
const b = async () => (await c()) + 2;
const c = async () => new Promise(resolve => { ... resolve(5) });
const value = await a();
这是一个简单的例子!
使用光纤,会容易得多:
const c = () => wait resolve => { ... resolve(5) }
不需要修改a和b!
PHP 从版本 8 开始实施纤程:
https://www.php.net/manual/en/language.fibers.php
- 您知道 JavaScript 的未来版本是否计划支持原生光纤吗?
- 你知道有没有地方可以看到 JavaScript 中计划的未来创新?
- 有没有什么地方可以让我们为JavaScript提出创新?
- 您认为原生光纤支持是个好主意吗?
提前致谢!
据我所知,目前未计划在 javascript 的未来版本中使用光纤,而且可能永远不会,因为 javascript 不是多线程的,也不会遇到同步问题。
Javascript 实现或多或少遵循 ECMAscript standards. You can follow the past and planned evolution on the ecma website and the draft specification.
据我了解光纤,它看起来像是 php 中控制并发的一种方式,我在 javascript 中看不到任何用例。异步性应该是明确的,并且以这种方式停止执行流程在 Javascript 中似乎不合适(考虑到浏览器或节点环境)。
也就是说,正如你所说,它可以在当前的js中显式实现(具有promises and/or async
/await
功能),ES2022引入了模块级别await
将 import
将具有此类构造的模块转换为隐式等待,然后才能使用代码。
好的,谢谢您的回答!
确实,如果处理不当,能够在代码中的任何一点“暂停”都可能成为错误的来源。
但是 await
也引入了这种危险,因为它允许其他代码部分并行执行。
换句话说,你必须积极参加比赛,必要时加锁。
我刚刚在 https://es.discourse.group/t/javascript-native-fibers/1281 上创建了主题。
您知道 JavaScript 的未来版本是否计划支持原生光纤吗?确实,如果可以这样写就太酷了:
console.log("sleep 3s...");
const value = wait (resolve, reject) => {
setTimeout(
() => resolve(5),
3_000
);
};
console.log("value =", value); // value = 5 (after 3s)
当然,使用 async/await
可能会得到类似的结果,但是纤程允许您在代码中的任何地方暂停,而不必在声明为 async
.[=18 的函数中=]
事实上,将同步函数转换为异步函数会变得非常有问题,因为有必要转换级联中的所有依赖项:
const a = () => b() + 1;
const b = () => c() + 2;
const c = () => 5;
const value = a();
好的,现在 c 变成了异步...
const a = async () => (await b()) + 1;
const b = async () => (await c()) + 2;
const c = async () => new Promise(resolve => { ... resolve(5) });
const value = await a();
这是一个简单的例子! 使用光纤,会容易得多:
const c = () => wait resolve => { ... resolve(5) }
不需要修改a和b!
PHP 从版本 8 开始实施纤程:
https://www.php.net/manual/en/language.fibers.php
- 您知道 JavaScript 的未来版本是否计划支持原生光纤吗?
- 你知道有没有地方可以看到 JavaScript 中计划的未来创新?
- 有没有什么地方可以让我们为JavaScript提出创新?
- 您认为原生光纤支持是个好主意吗?
提前致谢!
据我所知,目前未计划在 javascript 的未来版本中使用光纤,而且可能永远不会,因为 javascript 不是多线程的,也不会遇到同步问题。
Javascript 实现或多或少遵循 ECMAscript standards. You can follow the past and planned evolution on the ecma website and the draft specification.
据我了解光纤,它看起来像是 php 中控制并发的一种方式,我在 javascript 中看不到任何用例。异步性应该是明确的,并且以这种方式停止执行流程在 Javascript 中似乎不合适(考虑到浏览器或节点环境)。
也就是说,正如你所说,它可以在当前的js中显式实现(具有promises and/or async
/await
功能),ES2022引入了模块级别await
将 import
将具有此类构造的模块转换为隐式等待,然后才能使用代码。
好的,谢谢您的回答!
确实,如果处理不当,能够在代码中的任何一点“暂停”都可能成为错误的来源。
但是 await
也引入了这种危险,因为它允许其他代码部分并行执行。
换句话说,你必须积极参加比赛,必要时加锁。
我刚刚在 https://es.discourse.group/t/javascript-native-fibers/1281 上创建了主题。