Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript的承诺中返回早期解析时遇到问题_Javascript_Jquery_Promise - Fatal编程技术网

在JavaScript的承诺中返回早期解析时遇到问题

在JavaScript的承诺中返回早期解析时遇到问题,javascript,jquery,promise,Javascript,Jquery,Promise,我有一个函数,其中进一步的执行由函数本身决定。需要使用承诺,因为它是一个异步函数。问题是,即使在解决问题后,它仍会继续执行 我的代码: function initApp () { token = getToken () ; if ( token == null ) { resolve ('Not Found') ; } else { // ... async process if ( tokenStatus == "true

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

我的代码:

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,它仍然继续执行。正确的方法是什么?

resolve
reject
在您的函数中没有定义,因为它们超出了范围。您应该从init函数返回一个承诺,如下所示:

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)
})

你也没有正确地使用承诺。当您尝试做的事情成功时,您应该
解决
,当您尝试做的事情失败时,您应该
拒绝
。我的朋友,你的一个收获是阅读承诺以及JavaScript的基本部分(例如,你稍后将用一个变量覆盖
init
函数)。此外,您应该研究async&Wait,它使异步代码的读取更加同步。

您确实意识到
let init=
正在破坏
function init
对吗?也许有帮助-我添加了一些额外的行,这样您就可以获得更多的报酬-尽管这可能会有所帮助,但是我发现
//异步进程
之后是
令牌状态的同步测试
没有像那个人那样的问题;-)我在拉你的链条:p但是看到更新的提琴-我怀疑你仍然会有提到的问题顺便说一句,在实际功能中,是initApp
查看async&Wait使异步代码读取更同步
-问题是。。。承诺可以在旧的浏览器(如Internet Exploder)中使用-使用async/await需要传输。。。另一个没有那么多好处的复杂情况(在本场景中)@JaromandaX我理解您的担忧,但我将把这个决定留给提出问题的用户。我只是想让他走上正轨。谢谢兄弟的帮助。不过,请您详细说明上面评论中报告的问题。@SamagraSinghTomar并非所有web浏览器及其版本都支持最新的JavaScript语言功能。要解决这个问题,您可以对某些功能进行多填充,如
Promise
(如果它不存在),但并非所有功能都可以进行多填充。如果是这种情况,则需要使用Babel之类的工具将“现代”源代码“传输”到“旧”源代码,以使其正常工作。使用
async/await
特性的源代码被转换为常规回调样式的异步。看到和