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