Javascript承诺没有按预期工作

Javascript承诺没有按预期工作,javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我在这里宣布了我的承诺 const fetchmessage= new Promise( (resolve,reject)=>{ this.props.authStore.verifyLocalToken(); console.log("VLT Resolve"); resolve("Completed"); } );

我在这里宣布了我的承诺

   const fetchmessage= new Promise(
            (resolve,reject)=>{
              this.props.authStore.verifyLocalToken();
              console.log("VLT Resolve");
              resolve("Completed");
            }
            );

          fetchmessage.then(this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken));
以下是我的验证LocalToken代码

   verifyLocalToken() {
    console.log("VerifyLT - Start");
        fetch('http://xxx.xxx.xxx.xxx:8000/api/VerifyLocalToken', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: `mobileNumber=${this.mobileNumber}&key=${this.key}`
        }).then((response) => response.json()).then(
            (responseJson) => {
                console.log("http request v l t --", responseJson);
                this.firebaseToken = responseJson.firebaseToken;
            }).catch(
            (error) => {
                console.error(error);
            }
        )
        console.log("VerifyLT - Stop");

}
inboxMessageFetch(mobileNumber,firebaseToken) {
        console.log("InboxFetch  --", `${mobileNumber}/inbox`,firebaseToken);

            firebase.database().ref(`${mobileNumber}/inbox`)
                .on('value', snapshot => {
                    console.log('FB', snapshot.val());
                })
    }
以下是我的inboxMessageFetch代码

   verifyLocalToken() {
    console.log("VerifyLT - Start");
        fetch('http://xxx.xxx.xxx.xxx:8000/api/VerifyLocalToken', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: `mobileNumber=${this.mobileNumber}&key=${this.key}`
        }).then((response) => response.json()).then(
            (responseJson) => {
                console.log("http request v l t --", responseJson);
                this.firebaseToken = responseJson.firebaseToken;
            }).catch(
            (error) => {
                console.error(error);
            }
        )
        console.log("VerifyLT - Stop");

}
inboxMessageFetch(mobileNumber,firebaseToken) {
        console.log("InboxFetch  --", `${mobileNumber}/inbox`,firebaseToken);

            firebase.database().ref(`${mobileNumber}/inbox`)
                .on('value', snapshot => {
                    console.log('FB', snapshot.val());
                })
    }
输出如下

 verifyLocalToken() {
    return fetch('http://xxx.xxx.xxx.xxx:8000/api/VerifyLocalToken', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: `mobileNumber=${this.mobileNumber}&key=${this.key}`
        }).then((response) => response.json()).then(
            (responseJson) => {
                console.log("http request v l t --", responseJson);
                this.firebaseToken = responseJson.firebaseToken;
            }).catch(
            (error) => {
                console.error(error);
            }
        )
        console.log("VerifyLT - Stop");

}
不应该 http请求VLTInboxFetch--8891468710/收件箱未定义之前,因为http请求属于promise,并且是我们请求在获取http请求后运行的收件箱获取

如何重构代码并确保HTTP请求已完成,然后调用inbox fetch函数

      fetchmessage.then(this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken));
这段代码直接调用inboxMessageFetch函数,而不是等待then。我认为正确的代码是

fetchmessage.then(() =>      
    this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken);
)

您不需要做出新的承诺,但是您确实需要从您的方法返回承诺您的verifyLocalToken方法应该如下所示

 verifyLocalToken() {
    return fetch('http://xxx.xxx.xxx.xxx:8000/api/VerifyLocalToken', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: `mobileNumber=${this.mobileNumber}&key=${this.key}`
        }).then((response) => response.json()).then(
            (responseJson) => {
                console.log("http request v l t --", responseJson);
                this.firebaseToken = responseJson.firebaseToken;
            }).catch(
            (error) => {
                console.error(error);
            }
        )
        console.log("VerifyLT - Stop");

}
那你就可以这么做了

const fetchmessage = this.props.authStore.verifyLocalToken();
fetchmessage.then(() => {
    this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken));
}

这里有几个问题

  • 线路

    fetchmessage.then(this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken));
    
    调用
    this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken)
    并将其返回值传递到
    然后
    ,与
    foo(bar())
    调用
    然后将其返回值传递到
    foo
    。您可能打算传入一个函数,例如

    fetchmessage.then(() => this.props.inboxStore.inboxMessageFetch(mobileNumber,firebaseToken));
    
  • 在继续执行
    fetchmessage
    之前,您不会等待
    verifyLocalToken
    的异步工作完成

  • (与#2相关)
    verifyLocalToken
    不提供任何方式让调用方知道其工作已完成;它需要回报一个承诺

  • (与#2和#3相关)您已经在
    verifyLocalToken
    中从
    fetch
    获得了承诺;因此,无需创建新的承诺来保存在
    fetchmessage
    中。任何时候你有一个承诺,使用
    然后
    ,不要使用
    新承诺
    反模式

  • fetchmessage
    对我来说听起来像一个函数名,但在您的代码中,它是一个变量,将接收承诺,而不是函数

  • 下面是这些东西的大致外观(注意
    ***
    注释):

    然后
    fetchmessage

    const fetchmessage = this.props.authStore.verifyLocalToken()
        .then(value => {
            console.log("VLT Resolve");
            return "Completed"; // *** Really convert the value to completed?
        });
    
    …如果要将对
    的调用分开,则

    fetchmessage.then(result => this.props.inboxStore.inboxMessageFetch(mobileNumber, firebaseToken));
    
    这是您需要执行的操作的草图,不是要直接复制和粘贴的。仔细考虑这些变化,并在必要时加以应用


    请记住,承诺是一条管道,每个处理程序都可以在通过时转换值。

    但是。。。这是一个javascript承诺是的。。Javascript promise有什么问题吗?它按预期工作,你只希望它像不工作一样工作:)否则,你是在声称ES6本机代码中存在一个基本的bug,直到现在才被注意到?我不知道。我希望我的代码按预期运行。我找不到我的代码有任何问题。这就是我为什么这么问的原因,顺便说一句,我不明白为什么我的问题被否决了。我们不应该问这样的问题,所以?不应该,因为这是官方文件中解释的,这意味着你在发布之前没有研究过。