连锁功能,以便他们 运行 一旦前一个完成
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
.
中
我正在尝试将一些异步函数简单地链接在一起,以便它们按顺序运行。我可能犯了一个基本错误。
我只希望 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 看到
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
.