gpt4 book ai didi

javascript - 如果 "sync"-function 在 promise 中运行,它是否也同步?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:52:44 26 4
gpt4 key购买 nike

我只是想知道在 promise 中运行的“同步”函数是同步的(并减慢其他东西的速度)还是异步的,就像我想的那样?

例子:

function getFileContent(filepath){
return new Promise((resolve, reject) => {
fs.readFileSync("asd.txt"));
});
}

最佳答案

函数是同步的。期间。

可以异步的是(抽象的)流程/工作流。

当有人说一个函数是“异步的”时,他们的实际意思是结果将在一段时间后可用。结果包装在一个 Promise 中,它是等待的句柄。但是这个过程可能仍然是同步的。看看这个例子:

function foo() {
return new Promise((res, rej) => {
console.log(1);
console.log(2);
res();
});
};

function test() {
foo();
console.log(3);
};

并且输出始终相同:

> test();
1
2
3

这意味着每个函数都以同步的方式一个接一个地被调用。事实上,如果您将 foo 函数更新为:

function foo() {
return new Promise((res, rej) => {
while (true) {}
res();
});
};

您会注意到 console.log(3) 从不 运行。所以我们的 foo 永远阻塞!

现在看看这个例子:

function test() {
Promise.resolve().then(function() {
console.log(1);
console.log(2);
});
console.log(3);
};

并注意不同的结果:3 1 2所有这些功能都是同步的,那么为什么顺序不同呢?因为 .then() 将执行推迟到以后的某个时间。

总而言之:同步/异步实际上不是函数的属性,而是工作流的属性。在您的情况下,它是同步的。

旁注:当涉及异常时,这会变得更加复杂。让我们修改第一个示例中的 foo 函数:

function foo() {
return new Promise((res, rej) => {
throw 'myException';
});
};

function test() {
foo();
console.log(3);
};

并调用test()。哇哦,现在3是第一个(可能有人会认为根本不应该执行!!!),未捕获的异常myException第二个。为什么?因为 JavaScript 引擎推迟了异常处理。不要问我为什么,我不知道,但我确定这是有原因的……就像所有事情一样。 ;)

结论:Promise 不会使事情自动异步并始终await 或将.then() 与返回Promise 的函数一起使用(除非你是忍者)。

关于javascript - 如果 "sync"-function 在 promise 中运行,它是否也同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58321211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com