我正在尝试编写托管在 LAMP 服务器上的 jsPsych 实验。一切都运转良好;最后,我尝试通过执行重定向来转到下一个任务。
这是代码:
saveData(save_url, data_dir, file_name, extension, redirect_html, redirectToNextPage);
function saveData(save_url, data_dir, file_name, extension, redirect_html, callback) {
var xhr = new XMLHttpRequest();
xhr.open('POST', save_url); // 'write_data.php' is the path to the php file used to save the data
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
// Data was saved successfully, now trigger the callback function
callback(redirect_html);
} else {
// Handle any errors that occurred during data saving
console.error('Error saving data: ' + xhr.status);
}
}
};
xhr.send(JSON.stringify({file_name: file_name, extension: extension, data_dir: data_dir, data: jsPsych.data.get().csv()}));
}
function redirectToNextPage(redirect_html) {
if((window.location.href).indexOf('?') != -1) {
var variables = window.location.href.split('?')[1];
redirect_html += "?" + variables;
};
last_trial_data = jsPsych.data.getLastTrialData().trials[0];
if(last_trial_data["chain"] != "false"){
window.location = redirect_html;
};
}
尽管在调用函数之前等待使用 xhr.readyState === XMLHttpRequest.DONE
和 xhr.status === 200
确认数据已发布执行重定向,在 Firefox 上运行实验会引发 NS_BINDING_ABORTED
错误。我知道发生的情况是请求被重定向取消(因为在没有重定向的情况下运行实验可以正常工作并且数据已发送)。
有人知道出了什么问题吗?
最佳答案
我们最终找到了一个似乎可以通过调用 Promise 来工作的解决方案,我将把下面的代码留给后代:
function saveData(save_url, data_dir, file_name, extension) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open('POST', save_url);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
resolve();
} else {
reject(new Error('Error saving data: ' + xhr.status));
}
}
};
xhr.send(JSON.stringify({file_name: file_name, extension: extension, data_dir: data_dir, data: jsPsych.data.get().csv()}));
});
}
// Usage of async/await for the redirection
async function saveAndRedirect(save_url, data_dir, file_name, extension, redirect_html) {
try {
await saveData(save_url, data_dir, file_name, extension);
redirectToNextPage(redirect_html);
} catch (error) {
console.error(error);
}
}
function redirectToNextPage(redirect_html) {
if((window.location.href).indexOf('?') != -1) {
var variables = window.location.href.split('?')[1];
redirect_html += "?" + variables;
};
last_trial_data = jsPsych.data.getLastTrialData().trials[0];
if(last_trial_data["chain"] != "false"){
window.location = redirect_html;
};
}
关于javascript - xhr 在 Firefox 上发布数据和页面重定向 : NS_BINDING_ABORTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76775226/