【发布时间】:2020-12-31 15:04:15
【问题描述】:
我正在使用 js 和 jsPsych 编写实验代码。
在任务结束时,我想将数据保存到 Firebase Firestore,然后重定向到某个位置。但是,当我包含 window.location.replace 时,当前没有保存任何数据。 没有重定向它工作正常。但我两者都需要。任何建议将不胜感激。
jsPsych.init({
timeline: timeline,
preload_images: [
on_finish: function() {(saveData(jsPsych.data.get().json()));
(window.location.replace("https://url.com"));
},
});
function saveData(data){
console.log("trying to save");
const db = firebase.firestore();
var data = JSON.parse(data);
var namedData = {};
data.forEach(function(q) {
//console.log(q.internal_node_id)
if(q.hasOwnProperty("responses"))
{
q.responses = JSON.parse(q.responses);
}
namedData[q.internal_node_id] = q;
})
//db.collection("user").doc(subject_id).set(namedData)
db.collection("user").doc(subject_id).set(namedData)
.then(function() {
console.log("data saved")
})
}
非常感谢!
【问题讨论】:
-
在 Promise
set(namedData)解决之前,您是否正在离开页面?为了验证这个假设,您可以将您的window.location.replace移动到最后一个then函数的主体中,然后查看数据库写入是否有效。 -
您的重定向发生在保存数据之前。对
saveData和window.location.replace的调用是同步的。尽管如此,当您使用 Promisedb....then时,saveData本身是异步的。因此,您无需等待插入数据库完成即可重定向。所以是的,很可能数据正在保存,只是在您重定向时不正确,但稍晚一点。查看 JavaScript 的 async/await 以获得可能的解决方案,或将重定向放入then回调中。
标签: javascript firebase google-cloud-firestore jspsych