Javascript 如何在fetch-then/response函数中访问请求对象
我有一个JavaScript循环在数组上迭代。对于每个项目,我都执行一个提取请求来插入对象。如果服务器响应表明它是一个已插入的对象,我将尝试使用另一个获取调用执行更新操作 由于请求是异步的,在我尝试更新操作之前,循环会将请求对象设置为下一个插入项,因此我最终会请求对尚未插入的对象进行更新 是否有任何方法可以访问用于此获取操作的请求对象,以便使用该对象而不是循环变量 我在promise方法中尝试了Javascript 如何在fetch-then/response函数中访问请求对象,javascript,asynchronous,request,fetch,Javascript,Asynchronous,Request,Fetch,我有一个JavaScript循环在数组上迭代。对于每个项目,我都执行一个提取请求来插入对象。如果服务器响应表明它是一个已插入的对象,我将尝试使用另一个获取调用执行更新操作 由于请求是异步的,在我尝试更新操作之前,循环会将请求对象设置为下一个插入项,因此我最终会请求对尚未插入的对象进行更新 是否有任何方法可以访问用于此获取操作的请求对象,以便使用该对象而不是循环变量 我在promise方法中尝试了this,但它返回了对window对象的引用:console.log(this)=>>windowht
this
,但它返回了对window对象的引用:console.log(this)=>>windowhttp://localhost
我的代码:
for (var i = 0; i < expectedRows; i++) {
var row = myArray[i];
customerCode = row['customer_code'];
customerName = row['customer_name'];
customerBalance = row['customer_balance'];
// Build body call
var callBody = {
user: 'USER',
code: customerCode,
name: customerName,
balance: customerBalance
};
var fetchOptions = {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
redirect: "error",
referrer: "ux-import",
body: JSON.stringify(callBody),
};
// Call
var epurl = baseEP + '/customer/create';
fetch(epurl, fetchOptions)
.then(response => response.json())
.then(response => {
console.log(this) // <== Window object reference
if (response.error === 0) {
console.log('insert ok');
insertRows++;
} else {
if (response.error == 2) {
console.log('insert error => update');
var updateEP = baseEP + '/customer/update';
fetch(updateEP, fetchOptions) // <== Not what you expect
.then(updResponse => updResponse.json())
.then(updResponse => {
if (updResponse.error === 0) {
console.log('update ok.')
updateRows++;
} else {
console.log('update error: ' + updResponse.msg)
errorMessages.push(updResponse.msg);
}
})
.catch(error => {
console.log('update failure');
errorMessages.push(error);
});
} else {
console.log('insert error.');
errorMessages.push(response.msg);
}
}
})
.catch(error => {
console.log('insert failure.');
errorMessages.push(error);
});
}
你能试试这个吗
for (let i = 0; i < expectedRows; i++) {
let row = myArray[i];
customerCode = row['customer_code'];
customerName = row['customer_name'];
customerBalance = row['customer_balance'];
// Build body call
let callBody = {
user: 'USER',
code: customerCode,
name: customerName,
balance: customerBalance
};
let fetchOptions = {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
redirect: "error",
referrer: "ux-import",
body: JSON.stringify(callBody),
};
// Call
let epurl = baseEP + '/customer/create';
fetch(epurl, fetchOptions)
.then(response => response.json())
.then(response => {
console.log(this) // <== Window object reference
if (response.error === 0) {
console.log('insert ok');
insertRows++;
} else {
if (response.error == 2) {
console.log('insert error => update');
let updateEP = baseEP + '/customer/update';
fetch(updateEP, fetchOptions) // <== Not what you expect
.then(updResponse => updResponse.json())
.then(updResponse => {
if (updResponse.error === 0) {
console.log('update ok.')
updateRows++;
} else {
console.log('update error: ' + updResponse.msg)
errorMessages.push(updResponse.msg);
}
})
.catch(error => {
console.log('update failure');
errorMessages.push(error);
});
} else {
console.log('insert error.');
errorMessages.push(response.msg);
}
}
})
.catch(error => {
console.log('insert failure.');
errorMessages.push(error);
});
}
for(设i=0;iresponse.json())
。然后(响应=>{
console.log(this)//{
if(updResponse.error==0){
console.log('更新确定')
updateRows++;
}否则{
console.log('更新错误:'+updResponse.msg)
errorMessages.push(updResponse.msg);
}
})
.catch(错误=>{
console.log(“更新失败”);
错误消息。推送(错误);
});
}否则{
log('insert error');
errorMessages.push(response.msg);
}
}
})
.catch(错误=>{
log('insert failure');
错误消息。推送(错误);
});
}
基本上,用var
定义变量不是一个好方法,因为它不会在循环的每次迭代中保持其状态。但是使用let
可以为每次迭代维护变量状态,即使在您的案例中执行了一些异步任务(如fetch
)之后,也可以使用变量
for (let i = 0; i < expectedRows; i++) {
let row = myArray[i];
customerCode = row['customer_code'];
customerName = row['customer_name'];
customerBalance = row['customer_balance'];
// Build body call
let callBody = {
user: 'USER',
code: customerCode,
name: customerName,
balance: customerBalance
};
let fetchOptions = {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
redirect: "error",
referrer: "ux-import",
body: JSON.stringify(callBody),
};
// Call
let epurl = baseEP + '/customer/create';
fetch(epurl, fetchOptions)
.then(response => response.json())
.then(response => {
console.log(this) // <== Window object reference
if (response.error === 0) {
console.log('insert ok');
insertRows++;
} else {
if (response.error == 2) {
console.log('insert error => update');
let updateEP = baseEP + '/customer/update';
fetch(updateEP, fetchOptions) // <== Not what you expect
.then(updResponse => updResponse.json())
.then(updResponse => {
if (updResponse.error === 0) {
console.log('update ok.')
updateRows++;
} else {
console.log('update error: ' + updResponse.msg)
errorMessages.push(updResponse.msg);
}
})
.catch(error => {
console.log('update failure');
errorMessages.push(error);
});
} else {
console.log('insert error.');
errorMessages.push(response.msg);
}
}
})
.catch(error => {
console.log('insert failure.');
errorMessages.push(error);
});
}