javascript - 在javascript中发送请求在其他人之前运行
问题描述
我有这样的功能:
function sendRQ(url,filename){
new Promise(function (resolve, reject) {
console.log('111');
var request = new XMLHttpRequest();
request.timeout = 2000;
request.open('GET', url, true);
request.responseType = 'blob';
console.log('222');
request.onload = function (){
console.log('333');
let reader = new FileReader();
reader.readAsDataURL(request.response);
reader.onload = function (e) {
console.log('444');
var base = e.target.result;
resolve(base);
var arr = base.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type: mime});
};
console.log('555');
};
request.send();
console.log('666');
}).then(function (dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
console.log('777');
return new File([u8arr], filename, {type: mime});
}).then(function (file) {
console.log('888');
return file;
});}
我在每个级别设置了 console.log 以获得运行步骤的优先级。但是在回显“222”之后回显“666”。我该如何解决?我设置了 promise ,但是 in 不能正常工作!
解决方案
这是正常的,因为你使用 async ajax 在这一行
request.onload = function (){
您只是在声明一个将要执行的函数。当 onload 事件被触发时。
因此,记录 222 然后声明函数然后记录 555 并在发出 onload 之后是正常的。然后执行该功能。
您可以调用解析和路径任何数据。此数据将来自 promise.then(data => {}) 并且拒绝数据将来自 promise.catch(err => {})
在您的情况下,您正在解析 base 我认为您的意思是解析 File([u8arr], filename, {type: mime})
如果你想解析 new File([u8arr], filename, {type: mime})
reader.onload = function (e) {
console.log('444');
var base = e.target.result;
var arr = base.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
resolve(new File([u8arr], filename, {type: mime}));
};
并删除它,因为您已经解析了该文件
then(function (dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
console.log('777');
return new File([u8arr], filename, {type: mime});
})
推荐阅读
- azure - 从 Microsoft.Azure.ServiceBus 迁移到 Azure.Messaging.ServiceBus
- python - 构建轮子后找不到 Python 模块
- azure - 检查分支被锁定的次数以及锁定 Azure DevOps Rest API 的可能原因
- php - 哈希无法在其他程序上解密
- numpy - 如何有效地计算移位距离高斯图numpy
- arrays - 在将维度表列与值数组连接时,SNOWFLAKE 中的标识符 F.INDEX 无效
- python - 使用 Kubernetes、Python 和 Apache-Spark 3.2.0 在客户端模式下运行 spark 的两个单独的图像?
- css - 用 SVG 加下划线
- flutter - Flutter 旧项目
- javascript - JavaScript - 删除我的班级添加的事件侦听器的正确方法