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请求VLT在InboxFetch--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
的异步工作完成verifyLocalToken
不提供任何方式让调用方知道其工作已完成;它需要回报一个承诺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,直到现在才被注意到?我不知道。我希望我的代码按预期运行。我找不到我的代码有任何问题。这就是我为什么这么问的原因,顺便说一句,我不明白为什么我的问题被否决了。我们不应该问这样的问题,所以?不应该,因为这是官方文件中解释的,这意味着你在发布之前没有研究过。