Javascript 在同步代码中使用承诺

Javascript 在同步代码中使用承诺,javascript,promise,Javascript,Promise,我想知道在同步代码中使用承诺是否是错误的 我有一个入口点文件,里面有一个gigant代码,如: Promise.resolve(MAP) .then((MAP) => { return taskOne(); }) .then((MAP) => { return taskTwo(); }) .then((MAP) => { return taskThree(); }); 以此类推,直到任务十 在每个任务中,我都有同步代码,最

我想知道在同步代码中使用承诺是否是错误的

我有一个入口点文件,里面有一个gigant代码,如:

Promise.resolve(MAP)
  .then((MAP) => {

    return taskOne();
  })
  .then((MAP) => {

    return taskTwo();
  })
  .then((MAP) => {

    return taskThree();
  });
以此类推,直到任务十

在每个任务中,我都有同步代码,最后,我只是返回 地图的新值,如:

function taskOne(MAP) {
  // DO SOMETHING

  return MAP;
}
做那件事我感觉很好,但我不知道。。也许我做错了


谢谢。

首先,异步代码总是比同步代码复杂得多,所以我从来没有看到过一个理由,当我想把总是同步的东西变成异步的。然后()将同步代码强制为异步代码

其次,无论你的方案是否使用承诺编写,都充满了重复的代码。我建议你把它擦干,而不是一遍又一遍地复制同一个序列。当你把它晾干的时候,你可能会发现不再有理由使用承诺,因为你可以以同步的方式更简洁地解决你的问题

如果所有函数都使用相同的参数,并且只想将一个函数的返回结果传递给下一个函数,那么我建议您将函数放入一个数组中,并在数组中迭代,然后
。reduce()
是一种内置的设计模式,用于将结果从一个传递到下一个:

var fns = [taskOne, taskTwo, taskThree, taskFour, taskFive, taskSix, taskSeven, taskEight, taskNine, taskTen];

var final = fns.reduce(function(m, fn) {
    return fn(m);
}, MAP);

仅供参考,如果您的函数实际上是异步的并返回承诺,则可以稍微修改此模式以使其工作,但我不建议您在函数实际上是异步的之前切换到该模式:

var fns = [taskOne, taskTwo, taskThree, taskFour, taskFive, taskSix, taskSeven, taskEight, taskNine, taskTen];

fns.reduce(function(p, fn) {
    return p.then(fn);
}, Promise.resolve(MAP)).then(function(final) {
    // all done here
});

如果你只有同步代码,为什么要使用承诺?我相信维护更容易@DenysSéguretI可以更容易地控制我的应用程序的流程。如果我想改变流程,或者把一些任务放在另一个任务之前,这会更容易。作为调试。。如果发生无声错误,我可以更容易地找到它。为什么这比
taskOne()好;任务二();任务三()?因为我需要将映射传递给每个任务,所以我需要在每个任务的入口点和调用下一个任务后重新分配映射。像这样看起来更简单更清晰。你不是吗??我可以为将来的异步代码做准备。。那好多了!!!!谢谢@jfriend00!!!。。如果在某一点上我添加了一个异步任务呢???@Joao-添加了异步版本。如果您允许,最后一个问题。您说:“使用promissions with.then()强制您的同步代码现在变为异步。”这是一件坏事吗?因为如果我的同步代码变为异步,并且我仍然可以控制流,那么我的程序就不会更快了???@Joao-不,这不会让它更快。事实上,使同步任务异步会使其速度变慢,因为您一直在等待事件循环展开,而不仅仅是执行。请参阅以进行比较。Hei@jfriend00,谢谢您抽出时间!现在我明白了!