首页 > 解决方案 > JavaScript:在 Promise 链中,如果中间的一个函数什么都不返回但仍然执行异步操作会发生什么?

问题描述

在 Javascript 中链接 Promise 时,如果链中间的一个函数没有返回任何内容,但仍执行需要在继续之前完成的异步操作,会发生什么情况?

下一个“then()”是否等待前一个异步函数解析,即使它没有传递任何值?

编辑:这是一个应用程序示例:

connectDatabase()
  .then(() => createTables())
  .then(() => fillTables())
  .then(() => selectTables)
  .then(tables => showTables());

此代码仅表示 SQLite 数据库的创建和一些进一步的操作以最终显示表值。

connectDatabase()是一个异步函数。创建数据库后,该函数不需要返回任何内容,因为数据库存储在某个全局函数中(用于在 Promise 链之外使用)。下一步不需要任何参数,尽管它需要创建数据库以在其中插入表。

createTables()函数异步创建一些表,一旦完成,它什么也不返回,并且可以调用下一个函数。

selectTables()只需使用 sqlSELECT命令将表值存储在变量中并将其返回给下一个函数。

showTables()使用传递给它并显示在屏幕上的表值。

标签: javascriptes6-promise

解决方案


如果 Promise 链中的函数解析了一个值,那么链中的以下函数将有权访问解析的值。例如,在您的示例中,如果createTables解析了一个值,那么该解析的值将可用于链中的下一个函数作为参数(在本例中为(resolvedValue) => fillTables())。

如果它没有解析一个值(只是resolve()不带参数的调用,或者在函数的情况下根本不返回一个值async),那么链中的以下 Promise 将根本不会接收任何参数。

所以,是的,下一个then将始终等待前一个承诺解决(无论它是否用值解决)。

编辑:根据 Lennholm 的反馈删除/更正了我答案的第一部分(谢谢!)。then默认情况下会返回一个承诺,所以它永远是then-able. 如果传递给 then 的回调函数返回一个 promise,则 thenthen的 promise 将解析为回调解析的值;如果回调没有返回承诺,那么then将简单地解析回调返回的值。

有关这方面的更多信息,请查看以下答案:https ://stackoverflow.com/a/46142909/815086


推荐阅读