承诺等待得到解决而不返回

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.writeFileSyncdelay() 下面还是一个异步函数。 你的问题不清楚。能说清楚吗? @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 - 异步等待和获取 - 返回值,而不是承诺?

在自定义承诺上使用异步等待

在自定义承诺上使用异步等待

是否有一个函数返回一个承诺,当在 React Native 中应用了对组件的任何未决更改时,该承诺得到解决?

带有请求承诺的异步/等待返回未定义

JQuery 函数返回承诺,但“何时”仍然不等待