【问题标题】:Trouble returning early resolve in promises in JavaScript在 JavaScript 中的 Promise 中返回早期解决问题
【发布时间】:2017-09-29 11:51:38
【问题描述】:

我有一个函数,其中进一步的执行由函数本身决定。需要使用 Promise,因为它是一个异步函数。问题是即使在解决之后它仍会继续执行。

我的代码:

function initApp () {
    token = getToken () ;
    if ( token == null ) {
        resolve ('Not Found') ;
    } else {
        // ... async process
        if ( tokenStatus == "true" ) {
            resolve ('Welcome') ;
        } else {
            resolve ('Invalid') ;
        }
    }
}

let init = new Promise ( ( resolve , reject ) => { 
    initApp ();
});

init.then((successMessage) => {
    alert ( successMessage ) ;
}

我收到一个未定义的解析错误。另外,早些时候我没有使用 else 时,即使遇到 resolve,它也会继续执行。这样做的正确方法应该是什么?

【问题讨论】:

  • 你知道let init = 正在破坏function init 对吧?
  • 也许 this fiddle 有帮助 - 我添加了一些额外的行,以便您获得更多报酬 - 虽然 jsfiddle.net/dLwL424n/1 可能有帮助,但我闻到了 //async process 的问题,然后是 @987654327 的同步测试@
  • 不像那个人 ;-)
  • 我正在拉你的链 :p 但看到更新的小提琴 - 我怀疑你仍然会遇到提到的问题
  • 顺便说一句,在实际功能中,它是initApp

标签: javascript jquery promise


【解决方案1】:

resolvereject 在您的函数中未定义,因为它们超出了范围。相反,您应该从 init 函数返回一个 Promise,如下所示:

function init () {
  return new Promise((resolve, reject) => {
    let token = getToken()
    if (!token) {
      reject('not found')
    } else {
      doSomethingAsync((tokenStatus) => {
        if (!tokenStatus) return reject('Invalid')
        resolve('Welcome')
      })
    }
  })
}

init().then((successMsg) => {
  alert(successMsg)
}).catch((errMsg) => {
  alert(errMsg)
})

您也没有正确使用 Promise。当您尝试做的事情成功时,您应该resolve,当您尝试做的事情失败时,您应该reject。我的朋友给你的一个收获是阅读 Promises 以及 JavaScript 的基本部分(例如,你稍后用一个变量覆盖 init 函数)。此外,您应该研究 async 和 await ,它可以使异步代码更同步地读取。

【讨论】:

  • look into async & await which makes asynchronous code read more synchronously - 问题是...... Promise 可以在旧浏览器(即 Internet Exploder)中工作 - 使用 async/await 需要转译......这么多好处(在这种情况下)
  • @JaromandaX 我理解您的担忧,但我会将这个决定留给提出问题的用户。我只是为了让他走上正轨。
  • 感谢兄弟帮了大忙。虽然您能否详细说明上面评论中报告的问题。
  • @SamagraSinghTomar 并非所有 Web 浏览器及其版本都支持最新的 JavaScript 语言功能。为了解决这个问题,如果 Promise 不存在,您可以填充 某些 功能,但也不是所有功能都可以填充。如果是这种情况,则需要使用 Babel 之类的东西进行转换步骤,以将“现代”源代码“转换”为“旧”源代码,以便它工作。使用async/await 功能的源代码被转换为常规回调样式的异步。见caniuseBabel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2021-10-22
  • 2016-12-28
  • 2018-10-04
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多