【问题标题】:Javascript. Transform synchronous function as asynchronous using callbacks, promises, async/await, generatorsJavascript。使用回调、承诺、异步/等待、生成器将同步函数转换为异步函数
【发布时间】:2019-08-17 23:00:19
【问题描述】:

我有两个函数,之前被设计为同步运行。

function addOne(recievedInt) {
   ...some network requests happend...
   return recievedInt = receivedInt++;
}

function sum(arg1, arg2) {
   ... do some manipulations...
   return arg1 + arg2;
}

后两者都使用回调更改为异步,如下所示:function

addOne(recievedInt, callback),  sum(arg1, arg2, callback)

现在我需要将以前使用这两个函数的第三个函数从同步更改为异步,将回调传递给每个函数。

function compute(value) {
   var c = addOne(value);
   var a = sum(value, c) + c;
   return a;
}

我最好的解决方案是:

function compute(value) {
   return addOne(value, function(n1) {
      return sum(value, n1, function(n2) {
         return n2 + n1;
      });
   });
}

这是基于回调的异步版本的正确实现吗?以及如何使用 async/await、generators、Promises 进行转换

【问题讨论】:

  • 我认为真正的问题是为什么这些需要变成异步的?这些是否执行 async 操作?还是只是处理回调
  • 不确定这是否完全是一个骗局,但this question 可能有一些对您有帮助的想法
  • briosheje,是的,他们执行同步操作,我只是没有粘贴那个位。
  • 他们执行 SYNC 还是 ASYNC 操作?如果他们执行 sync 操作,请问你为什么需要让他们 async?当然,您可以通过简单地将它们包装在 promise 块中来做到这一点,但对我来说,问题是 为什么您应该这样做,因为它们 不是异步的。跨度>

标签: javascript asynchronous callback synchronization


【解决方案1】:

这是您可以将原始代码重构为异步/等待(不使用回调)的一种方法:

const fakeAsyncStuff = () => Promise.resolve();

const addOne = async n => {
  await fakeAsyncStuff();
  return n + 1;
};

const sum = async (a, b) => {
  await fakeAsyncStuff();
  return a + b;
};

const compute = async value => {
  const c = await addOne(value);
  const a = await sum(value, c);
  return c + a;
};

compute(1).then(console.log);

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2020-11-19
    • 2021-07-16
    相关资源
    最近更新 更多