【发布时间】:2019-09-23 17:56:08
【问题描述】:
我对 nodejs/javascript 中异步处理的理解是,如果在函数中处理异步调用,它必须返回一个承诺或接受回调以进行链接以及等待异步调用完成。
但我发现它没有,因为以下代码有效并等待所有承诺完成
function handlePromise() {
Promise.resolve('Hello Async').then(data => {
Promise.resolve('Hello Async 2').then(data => {
return delay(3000).then(() => console.log(data));
});
return delay(2000).then(() => console.log(data));
});
Promise.resolve('hello').then(data => console.log(data))
};
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time))
}
function handlePromise2() {
handlePromise()
};
handlePromise2();
function handlePromise() {
return Promise.resolve('Hello Async').then(data => {
return Promise.resolve('Hello Async 2').then(data => {
return delay(3000).then(() => console.log(data));
});
}).then(() => {
return Promise.resolve('hello').then(data => console.log(data))
}).then(() => {
return Promise.resolve('hello').then(data => console.log(data))
});
};
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time))
}
function handlePromise2() {
return handlePromise()
};
handlePromise2();
同样适用于回调
const fs = require('fs')
function handlePromise() {
delay();
console.log('sync')
};
function delay() {
fs.writeFile('data.txt', 'Hello Async', () => console.log('done'));
}
handlePromise();
那么我在这里错过了什么?
如果只是用 promise 调用 then 来解决 promise,那么如果我不需要已解决的值,那么 async/await 的意义何在?
【问题讨论】:
-
使用 async/await 或致电
fs.writeFileSync。delay()下面还是一个异步函数。 -
你的问题不清楚。能说清楚吗?
-
@MatJ 更新了问题
-
@Shubham 问题不在于它不起作用,问题在于它起作用,问题是如何以及为什么?
-
如果您的意思是即使“您的代码”不关心结果,节点进程也不会终止,那么在有计划任务(计时器或 I/O)之前它不会终止。顺便说一句,您可以取消引用计时器以使节点在退出之前忽略一个。如果您执行
resolve => setTimeout(resolve, time).unref(),您的第一个示例将退出节点
标签: javascript node.js promise