连锁功能,以便他们 运行 一旦前一个完成

Chain functions so that they run once previous is complete

我正在尝试将一些异步函数简单地链接在一起,以便它们按顺序运行。我可能犯了一个基本错误。

我只希望 printFirst 到 运行,然后 printSecond 完成后到 运行。
下面是我的代码不起作用

const printFirst = ()=>{
  console.log('First')
}
const printSecond = ()=>{
  console.log('Second')
}
// Print this first (after 2 sec)
const first = () =>{
  setTimeout(printFirst,2000)
}
// Once the above function is run then run this
const second = () =>{
  setTimeout(printSecond,2000)
}

first()
.then(second())

我收到错误

node timeout.js
file:///Users/bob/Documents/dev/javascript/node/nodeScratch/timeout.js:20
.then(second())
^

TypeError: Cannot read properties of undefined (reading 'then')
    at file:///Users/bob/Documents/dev/javascript/node/nodeScratch/timeout.js:20:1
    at ModuleJob.run (node:internal/modules/esm/module_job:195:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)

我确实在这里 post 看到 这表明我可能不必使用“then”。但是我不确定这是否真的与我的用例相关。

JS 中的基本异步函数基于 Promises。您可以编写一个等待网络响应或其他 IO 的 Promise。您可以编写一个等待用户交互的代码。您还可以编写一个等待 setTimeout 结束的代码。这是其中的一个例子:

const printFirst = ()=>{
  console.log('First')
}
const printSecond = ()=>{
  console.log('Second')
}
// Print this first (after 2 sec)
const first = () => new Promise ((resolve, reject) => {
  setTimeout(() => resolve(printFirst()), 2000)
})

// Once the above function is run then run this
const second = () =>{
  setTimeout(printSecond,2000)
}

first()
  .then (second)

除了将您的第一个函数包装在 new Promise 调用中,我们还需要切换

first () .then (second ())

first () .then (second)

第一个立即触发 second 函数并将它的 结果 传递给 .then。相反,我们想传递 函数 本身。对于更复杂的需求,您可以改为这样做:

first () .then (result => second (result, someOtherArgument))

如果你想在 second 之后 运行 添加其他东西,那么它也需要包裹在 Promise.