javascript - Promise 等待解决而不返回

标签 javascript node.js promise

我对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();
当我将 promise 返回到最后时,它应该会起作用。

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 。 这就是您在第二个片段中所做的事情。

现在可怜的handlePromise()不知道如何处理食物enter image description here

关于javascript - Promise 等待解决而不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55999404/

相关文章:

javascript - React,将 onClick 事件直接添加到组件而不是在所述组件内渲染元素。

javascript - 关于 `export` 用法的功能等效性的困惑

node.js - 等待所有查询完成并同时异步填充

javascript - IE 9 通过 Javascript 设置样式属性,不使用 JQuery 库

javascript - 使 D3 图形响应

javascript - 函数需要和不需要的变量

node.js - 为什么 `buffer` 和 `new Buffer(buffer.toString())` 并不总是逐字节相等?

node.js - 模块导出功能

node.js - 将嵌套循环查询组合到父数组结果 - pg-promise

javascript - Cordova SQLite 插件 promise javascript 链