如何推迟长时间的简单功能?

时间:2019-05-03 16:09:15

标签: javascript node.js

我创建微服务,并且在一个功能中,我还拥有其他三个功能:

functionA();
functionB();
functionC();

return json({status: processed});

所有函数都是同步的,但是它们执行数学运算。 functionB是执行时间最长的,所以我想将其用作异步的HTTP请求。

我尝试过:

functionB() {
    return new Promise(//etc...);
}

async functionB() {
    return 1;
}

但是我的功能仍然是同步的。

Node如何识别可以立即运行或应该进入事件循环的功能?为什么Promise和async在这种情况下不起作用?

1 个答案:

答案 0 :(得分:0)

先记录“ foo”,然后记录“ bar”

function foobar() {
  var p = Promise.resolve();
  p.then(() => console.log('bar'));
  console.log('foo');
  return p;
}

这会先记录“ bar”,然后记录“ foo”。

function foobar() {
  var p = new Promise((resolve, reject) => {
    console.log('bar');
    resolve();
  })
  console.log('foo');
  return p;
}

这是因为传递给(resolve, reject) => ...的回调new Promise在promise创建过程中被立即调用,因此该回调实际上是一个同步函数。

类似地具有异步功能。

async function B() {
  return 1;
}

标记同步功能async并不能使它“异步”。如果函数主体(在此示例中为return 1)包含所有同步操作,则它与传递给new Promise的回调相同,在调用时仍会同步执行。

如果确实需要将任务推迟到下一个循环迭代,则使用setTimeout(cb)setImmediate(cb)更有希望。 cb肯定是异步的。