我对nodejs/javascript中异步处理的理解是,如果在函数中处理异步调用,它必须返回一个 promise 或接受用于链接的回调以及等待异步调用完成。
但我发现事实并非如此,因为以下代码有效并等待所有 promise 完成
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 的意义何在?
最佳答案
如果我正确理解你的问题,你是说第一个片段不应该工作,因为它没有返回 promise ,而你问为什么它有效。
简短回答:它没有真正工作,handlePromise2()
完成并返回,而不等待 promise 得到解决或拒绝。
长答案:这就像你去面包店要面包,但在离开后并没有排队等候,面包仍然被烘烤,但随后它被扔掉了,因为客户端(在我们的例子中是 handlePromise2
)发出了调用并假设工作已经完成,毕竟它的范围只是调用该函数。
使用 Promise 是为了让调用函数的客户端知道期待什么,所以在你请求面包之后,你会等待它完成,这就是所谓的 promise 它不是实际值(又名面包),而是一个值的 promise 。 这就是您在第二个片段中所做的事情。
关于javascript - Promise 等待解决而不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55999404/