Axios DELETE 调用 CORS 服务器触发 promise resolve on preflight OPTIONS 调用
Axios DELETE call to CORS server triggers promise resolve on preflight OPTIONS call
我有一个带有 CORS 设置的 API 以允许来自特定来源的任何方法和 headers。使用 axios,我试图对服务器进行并发 DELETE 调用,然后在完成所有删除调用后重新加载所有数据,例如
//module ajax;
const deleteAsset = function(id) {
return axios.delete('/api/Asset/' + id);
};
const getAllAssets = function() {
return axios.get('/api/Asset/');
};
//module data
...
Promise.all(ids.map(id => { ajax.deleteAsset(id); }))
.then(() => { ajax.getAllAssets(); });
我发现的问题是,由于预检 OPTIONS 请求,承诺在 OPTIONS 请求后得到解决 returns,而不是等待 DELETE 请求(因此在删除发生之前重新加载数据在服务器上)。
有什么办法可以防止这种情况发生,只解决 DELETE 请求上的承诺吗?
您对 OPTIONS 的解释不正确。不同步是因为你的代码。
你应该 => ajax.deleteAsset(id)
或 => {return ajax.deleteAsset(id)}
。在您的情况下,您没有 return 地图的承诺,因此您无法同步您的承诺。
您可以 console.log
下面的 dfds
来验证它确实是一个包含 Promise
(而不是 undefined
)
的数组
下面的代码应该允许您同步删除和 "retrievement"
const dfds = ids.map(id => ajax.deleteAsset(id))
return Promise.all(dfds).then(_ => ajax.getAllAssets())
(替代 return)
const dfds = ids.map(id => { return ajax.deleteAsset(id) })
return Promise.all(dfds).then(_ => { return ajax.getAllAssets() })
我有一个带有 CORS 设置的 API 以允许来自特定来源的任何方法和 headers。使用 axios,我试图对服务器进行并发 DELETE 调用,然后在完成所有删除调用后重新加载所有数据,例如
//module ajax;
const deleteAsset = function(id) {
return axios.delete('/api/Asset/' + id);
};
const getAllAssets = function() {
return axios.get('/api/Asset/');
};
//module data
...
Promise.all(ids.map(id => { ajax.deleteAsset(id); }))
.then(() => { ajax.getAllAssets(); });
我发现的问题是,由于预检 OPTIONS 请求,承诺在 OPTIONS 请求后得到解决 returns,而不是等待 DELETE 请求(因此在删除发生之前重新加载数据在服务器上)。
有什么办法可以防止这种情况发生,只解决 DELETE 请求上的承诺吗?
您对 OPTIONS 的解释不正确。不同步是因为你的代码。
你应该 => ajax.deleteAsset(id)
或 => {return ajax.deleteAsset(id)}
。在您的情况下,您没有 return 地图的承诺,因此您无法同步您的承诺。
您可以 console.log
下面的 dfds
来验证它确实是一个包含 Promise
(而不是 undefined
)
下面的代码应该允许您同步删除和 "retrievement"
const dfds = ids.map(id => ajax.deleteAsset(id))
return Promise.all(dfds).then(_ => ajax.getAllAssets())
(替代 return)
const dfds = ids.map(id => { return ajax.deleteAsset(id) })
return Promise.all(dfds).then(_ => { return ajax.getAllAssets() })