承诺等待得到解决而不返回
Posted
技术标签:
【中文标题】承诺等待得到解决而不返回【英文标题】:Promise waits to get resolve without return 【发布时间】: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()
,您的第一个示例将退出节点
【参考方案1】:
如果我理解你的问题是正确的,你是说第一个 sn-p 不应该工作,因为它没有返回承诺并且你问它为什么工作。
简短回答:它真的工作,handlePromise2()
完成并返回,而无需等待承诺得到解决或拒绝。
长答案:就像你去面包店要面包,但你离开后没有排队等候,面包仍然烤好了,但随后被扔掉了,因为客户(在我们的例子中那是handlePromise2
) 进行了调用并假设工作已经完成,毕竟它的范围只是调用该函数。
使用 Promise 是为了让调用函数的客户端知道期待某些东西,所以在你要面包之后,你会等待它完成,这称为 promise这不是实际价值(又名面包),而是价值的承诺。 这就是你在第二个 sn-p 中所做的。
现在可怜的handlePromise()
不知道怎么处理食物
【讨论】:
如果它不起作用,你就明白了,我仍然在控制台上获得输出,为什么事件循环仍在等待。我已经添加了我不关心解决的值,而只关心完成。因此,当我添加 I/O 操作(例如使用异步调用写入文件但不等待它)时,它仍然完成,那么同步和异步方法有什么不同? @AZ_ 因为线程还活着,handlePromise2()
结束后应用没有退出
所以在事件队列中有事件之前进程不会终止?
不,JS 不会自行终止,直到服务器终止它,所以它取决于你运行它的平台,即浏览器、节点...等以上是关于承诺等待得到解决而不返回的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 异步等待和获取 - 返回值,而不是承诺?