javascript - 承诺搞砸了?
问题描述
在过去的几天里,这个问题一直让我发疯。我远非 Javascript 专家,也许解决方案很明显,但我看不到。
我基本上尝试做的是:
- 并行下载项目,每个请求都是针对具有不同属性的给定项目类型(type1,type2)发出的。
- 下载后,执行回调函数对数据进行后处理(这是同一个函数,但参数不同,并测试项目类型,以便进行不同的处理)
- 保存项目
如果我下载 1 个项目类型,一切正常。但是,如果我下载了 2 种类型,那么在第一次回调执行中的处理循环中的某个时刻,恰好当第二次为第二种类型执行回调时,类型的测试将表明它是第二种类型,而项目属于第一种类型...
这是代码的摘录:
downloadType1();
downloadType2();
// 2nd argument of download() is the callback function
// 3rd argument is the callback function parameters
function downloadType1() {
// Some stuff here
let callbackParameters = ['type1', 'directory1'];
download('url', headacheCallback, callbackParameters);
}
function downloadType2() {
// Some the stuff here
let callbackParameters = ['type2', 'directory2'];
download('url', headacheCallback, callbackParameters);
}
async function download(url, callbackBeforeSave, callbackParameters) {
// Some stuff here
let response;
try {
response = await rp(url);
} catch (e) {
console.log("Error downloading data");
}
// Call callbacks before saving the data
if(callbackBeforeSave) {
let updatedResponse;
if (callbackParameters) {
updatedResponse = await callbackBeforeSave(response, ...callbackParameters);
} else {
updatedResponse = await callbackBeforeSave(response);
}
response = updatedResponse;
}
// Some stuff here with the post-processed data
}
async function headacheCallback(data, type, directory) {
for (item of data) {
// Some stuff here, include async/await calls (mostly to download and save files)
console.log(type, item.propertyToUpdate, item.child.propertyToUpdate);
// This is were my issue is.
// The test will success although I'm still the 'type1' loop. I know because the console.log above shows the item is indeed of type 'type1'
if (type === 'type2') {
item.child.propertyToUpdate = newUrl; // Will eventually fail because 'type1' items don't have a .child.propertyToUpdate property
} else {
item.propertyToUpdate = newUrl;
}
}
}
在某些时候,将的输出console.log
是:
type2 <valueOfTheProperty> undefined
应该是type2 undefined <valueOfTheProperty>
......
快速思考:在回调的第一个版本中,我将arguments
全局变量与function.apply(...)
. 这很糟糕,因为arguments
它是全球性的,因此在第二次通话后被改变了......
但是现在我在我的代码中看不到任何全局性的东西可以解释为什么type
会发生变化。
任何帮助将不胜感激。
谢谢!
解决方案
我在我的代码中没有看到任何可以解释类型为什么会发生变化的全局内容。
这并不是type
在改变。你的问题是item
这是一个非自愿的全局:
for (item of data) {
// ^^^^
让它成为
for (const item of data) {
// ^^^^
并始终启用严格模式!
推荐阅读
- asp.net - 在 docker 中使用 4.8 为 4.5 框架构建 .net 失败
- reactjs - 如何在反应中使用ckeditor4上传图像
- javascript - 像在 C 中一样从字符和字节值初始化 ArrayData
- python - NumPy 如何计算矩阵的逆?
- json - 是否可以修改 ServiceNow Virtual Agent Rest API 的响应?
- javascript - 在对象数组中使用 I18n 反应本机问题
- c++ - 链接不同C++标准编译的库有隐患吗?
- laravel - 表单提交时引导模式关闭
- wordpress - 如何通过代码检查 REST API 是否处于活动状态?
- java - 如何从 GoogleCredential 迁移到 GoogleCredentials 并且仍然可以访问 People API?