JS 保存数据然后重定向
JS save data THEN redirect
我正在使用 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")
})
}
非常感谢!
有人评论说:在数据保存到数据库之前,您正在重定向。为防止这种情况,您必须等到数据被保存,为此您可以使用您当前使用的 then()
来记录。
所以:
on_finish: function() {
saveData(jsPsych.data.get().json());
},
});
function saveData(data){
console.log("trying to save");
const db = firebase.firestore();
var data = JSON.parse(data);
var namedData = {};
data.forEach(function(q) {
if(q.hasOwnProperty("responses")) {
q.responses = JSON.parse(q.responses);
}
namedData[q.internal_node_id] = q;
})
db.collection("user").doc(subject_id).set(namedData)
.then(function() {
console.log("data saved");
window.location.replace("https://url.com")
})
}
如果您愿意,可以 return 来自 saveData
的承诺并在调用者中使用它:
on_finish: function() {
saveData(jsPsych.data.get().json()).then(function() {
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) {
if(q.hasOwnProperty("responses")) {
q.responses = JSON.parse(q.responses);
}
namedData[q.internal_node_id] = q;
})
return db.collection("user").doc(subject_id).set(namedData);
}
我正在使用 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")
})
}
非常感谢!
有人评论说:在数据保存到数据库之前,您正在重定向。为防止这种情况,您必须等到数据被保存,为此您可以使用您当前使用的 then()
来记录。
所以:
on_finish: function() {
saveData(jsPsych.data.get().json());
},
});
function saveData(data){
console.log("trying to save");
const db = firebase.firestore();
var data = JSON.parse(data);
var namedData = {};
data.forEach(function(q) {
if(q.hasOwnProperty("responses")) {
q.responses = JSON.parse(q.responses);
}
namedData[q.internal_node_id] = q;
})
db.collection("user").doc(subject_id).set(namedData)
.then(function() {
console.log("data saved");
window.location.replace("https://url.com")
})
}
如果您愿意,可以 return 来自 saveData
的承诺并在调用者中使用它:
on_finish: function() {
saveData(jsPsych.data.get().json()).then(function() {
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) {
if(q.hasOwnProperty("responses")) {
q.responses = JSON.parse(q.responses);
}
namedData[q.internal_node_id] = q;
})
return db.collection("user").doc(subject_id).set(namedData);
}