Javascript 异步函数是否仅用于IO阻塞操作?

Javascript 异步函数是否仅用于IO阻塞操作?,javascript,node.js,promise,async-await,es6-promise,Javascript,Node.js,Promise,Async Await,Es6 Promise,我有一些函数可以对数据和数组进行大量计算,但都在内存中,它不执行任何IO。我一直在阅读试图进入nodejs的文章,我想知道使then异步是否有任何好处?例如,函数a: 在这种情况下,如果不涉及任何IO阻塞操作,那么返回承诺是否有意义?例如: function a(b, c, d) { return new Promise(resolve, reject) { // a lot of operations with arrays resolve(value); } } 在

我有一些函数可以对数据和数组进行大量计算,但都在内存中,它不执行任何IO。我一直在阅读试图进入nodejs的文章,我想知道使then异步是否有任何好处?例如,函数a:

在这种情况下,如果不涉及任何IO阻塞操作,那么返回承诺是否有意义?例如:

function a(b, c, d) {
  return new Promise(resolve, reject) {
    // a lot of operations with arrays
    resolve(value);
  }
}

在这种情况下,使用承诺有什么改进吗?或者我只是将其过度复杂化,应该只返回值而不是承诺?

没有,异步函数只是承诺之上的语法糖。如果您的函数实际上没有任何像网络请求这样的异步操作,它将保持同步执行并同步解析,因此它与普通函数没有什么不同


Javascript是单线程的。

不,异步函数只是承诺之上的语法糖。如果您的函数实际上没有任何像网络请求这样的异步操作,它将保持同步执行并同步解析,因此它与普通函数没有什么不同

Javascript是单线程的。

您可以批量对数组执行大量操作,以避免阻止其他执行-以下是伪代码,因为您没有显示//对数组执行的大量操作实际上是什么。。。所以

function a(b, c, d) {
    return new Promise((resolve, reject) => {
        function processBatch() {
            // do some operations with arrays
            if (error) {
                reject(error);
            } else if (needToProcessMore) {
                setImmediate(processBatch);
            } else {
                resolve(someResult);
            }
        }
        setImmediate(processBatch);
    });
}
或者,尽管我自己从来没有使用过它们,但有线程和线程工作者类型库可用于节点

您可以批量对数组执行大量操作,以避免阻止其他执行-以下是伪代码,因为您没有显示//对数组执行的大量操作实际上是什么。。。所以

function a(b, c, d) {
    return new Promise((resolve, reject) => {
        function processBatch() {
            // do some operations with arrays
            if (error) {
                reject(error);
            } else if (needToProcessMore) {
                setImmediate(processBatch);
            } else {
                resolve(someResult);
            }
        }
        setImmediate(processBatch);
    });
}

或者,尽管我自己从来没有使用过它们,但有线程和线程工作者类型库可用于节点

传递给Promise构造函数的执行器是同步执行的-因此,没有任何好处,但奇怪的是,我看到一些代码运行速度快了10倍-至少在firefox中是这样,因此,我猜没有那么重要-在executor内部-注意:您发布的承诺代码无效。此线程可以帮助您解决此问题:如上所述,您可以使用数组编写//许多操作的代码,这样它就不会阻塞-即使其伪异步,通过以setTimeout/setImmediate/任何可用的受控顺序执行小批量操作,在这种情况下,承诺可能是有益的。这真的取决于操作是什么,以及为什么您希望它们是非阻塞的-这是某种类型的服务器的一部分,并且在执行密集计算时停止响应客户端请求吗?@JaromandaX是的,在给出响应之前,它们是服务器进程的一部分,目前我没有遇到任何性能问题,但我担心在有更多请求的情况下,我会开始遇到问题。请查看我的答案-显然,我无法帮助您拆分并在阵列上执行某些操作,因为您尚未显示有关阵列的大量操作的任何详细信息-但希望这能提供更多信息你知道可以做什么吗?传递给Promise构造函数的执行器是同步执行的-所以,没有任何好处,但奇怪的是,我已经看到一些代码运行速度快了10倍-至少在firefox中是这样,因此,我猜没有那么重要-在executor内部-注意:您发布的承诺代码无效。此线程可以帮助您解决此问题:如上所述,您可以使用数组编写//许多操作的代码,这样它就不会阻塞-即使其伪异步,通过以setTimeout/setImmediate/任何可用的受控顺序执行小批量操作,在这种情况下,承诺可能是有益的。这真的取决于操作是什么,以及为什么您希望它们是非阻塞的-这是某种类型的服务器的一部分,并且在执行密集计算时停止响应客户端请求吗?@JaromandaX是的,在给出响应之前,它们是服务器进程的一部分,目前我没有遇到任何性能问题,但我担心在有更多请求的情况下,我会开始遇到问题。请查看我的答案-显然,我无法帮助您拆分并在阵列上执行某些操作,因为您尚未显示有关阵列的大量操作的任何详细信息-但希望这能提供更多信息你知道什么是可以做到的这只不过是99%的正确。所有.then处理程序都是异步执行的,因此将一组同步代码放在异步函数或返回承诺的常规函数中,将立即解析承诺,但不会同步调用.then处理程序-它们仍将在将来被调用。在任何情况下,都不应该对完全同步的代码使用异步函数
与async await无关,OP甚至不在代码中使用async或await关键字!!不确定这怎么可能回答这个问题:p@JaromandaX我使用async-await在另一个函数中调用这个函数。除非在其他方面有另一个答案,否则这个答案确实解决了我的问题,因为现在我知道,我不会从回报承诺而不仅仅是回报价值中得到任何好处。这只有99%是正确的。所有.then处理程序都是异步执行的,因此将一组同步代码放在异步函数或返回承诺的常规函数中,将立即解析承诺,但不会同步调用.then处理程序-它们仍将在将来被调用。在任何情况下,都不应该对完全同步的代码使用async函数。我知道使用了async这个词,并且问题标记为async await-但是问题实际上与async await是什么无关,OP在代码中甚至不使用async或await关键字!!不确定这怎么可能回答这个问题:p@JaromandaX我使用async-await在另一个函数中调用这个函数。除非在其他方面有另一个答案,否则这个答案确实解决了我的问题,因为现在我知道,我不会从回报承诺而不仅仅是回报价值中得到任何好处。