【问题标题】:How does .then pass the results of the invoking function to its promise?.then 如何将调用函数的结果传递给它的 promise?
【发布时间】:2020-06-13 14:32:05
【问题描述】:

我已经解决了一些与此类似的问题,但无法找到一个我无法理解的特定问题。我将插入代码、输出的内容、我无法理解的内容,也许有人可以指出我缺少的内容:

async function add(x, y) {
 return x + y
}

add(1,2).then((result) => {
 console.log(result)
})

3

到目前为止,我知道 JS 中的异步函数总是会返回一个 Promise,但我对 Promise 的理解是,它们接受两个函数回调作为参数,一个用于当 Promise 解决时,另一个用于遇到错误时。编译器如何知道将此处的 add 函数的结果传递给返回的 Promise 的 resolve 回调?是不是假设在调用.then时返回的promise的resolve回调的第一个参数是调用函数的返回值?

【问题讨论】:

  • 但我对 Promise 的理解是,它们接受两个函数回调作为参数,一个用于 Promise 解决时,另一个用于遇到错误时 这仅适用于Promise 构造函数,仅此而已
  • 我会推荐阅读承诺。我个人会推荐javascript.info
  • @CertainPerformance 我以为 OP 是在谈论 .then() 以两个回调作为参数,一个用于承诺履行时,另一个用于拒绝时......

标签: javascript asynchronous promise


【解决方案1】:

到目前为止,我知道 JS 中的异步函数总是会返回一个 Promise,但我对 Promise 的理解是,它们接受两个函数回调作为参数,一个用于当 Promise 解决时,另一个用于遇到错误时。

Promise 构造函数就是这种情况。它需要一个resolve和一个reject函数,其中一个(resolve)你用值调用来解决promise,另一个(reject)你用错误调用来抛出。但是,异步函数略有不同。当他们返回一个值时,他们实际上返回了一个解析到他们返回的值的承诺。如果有错误,它会拒绝它并抛出一个 promise 错误。此外,Promise.prototype.then 将始终处理 promise 解析的值,Promise.prototype.catch 将始终处理 promise 拒绝的错误。

【讨论】:

  • 谢谢。这(以及类似的 cmets)以及 Promises 上的 javascript.info 页面有助于明确问题。这一行:promise.then(function(result) { /* 处理一个成功的结果 / }, function(error) { / 处理一个错误 */ } );让它点击。
  • 很高兴能为您提供帮助!简单说明一下,最好只给.then提供一个函数(成功promise的函数),给.catch提供错误处理函数。
【解决方案2】:

如果您熟悉Promises(“resolve”函数)的工作原理,那么下面的代码 sn-p 可能会有所帮助。

async function add(x, y) {
 return x + y
}

add(1,2).then((result) => {
 console.log(result)
})

//can be written as

function add2 (x,y){
  return new Promise((resolve,reject)=>{
   resolve(x+y);
  })
}

add2(1,2).then((result) => {
 console.log(result)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2018-01-03
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2018-06-05
    • 2014-07-13
    相关资源
    最近更新 更多