Javascript 如何在fetch-then/response函数中访问请求对象

Javascript 如何在fetch-then/response函数中访问请求对象,javascript,asynchronous,request,fetch,Javascript,Asynchronous,Request,Fetch,我有一个JavaScript循环在数组上迭代。对于每个项目,我都执行一个提取请求来插入对象。如果服务器响应表明它是一个已插入的对象,我将尝试使用另一个获取调用执行更新操作 由于请求是异步的,在我尝试更新操作之前,循环会将请求对象设置为下一个插入项,因此我最终会请求对尚未插入的对象进行更新 是否有任何方法可以访问用于此获取操作的请求对象,以便使用该对象而不是循环变量 我在promise方法中尝试了this,但它返回了对window对象的引用:console.log(this)=>>windowht

我有一个JavaScript循环在数组上迭代。对于每个项目,我都执行一个提取请求来插入对象。如果服务器响应表明它是一个已插入的对象,我将尝试使用另一个获取调用执行更新操作

由于请求是异步的,在我尝试更新操作之前,循环会将请求对象设置为下一个插入项,因此我最终会请求对尚未插入的对象进行更新

是否有任何方法可以访问用于此获取操作的请求对象,以便使用该对象而不是循环变量

我在promise方法中尝试了
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);
    });
}