作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
过去几天这个问题一直让我抓狂。我远不是 Javascript 专家,也许解决方案是显而易见的,但我没有看到它。
我基本上尝试做的是:
如果我下载 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
正在改变。
任何帮助将不胜感激。
谢谢!
最佳答案
I don't see anything global in my code that could explain why type is changing.
改变的不是类型
。您的问题是 item
,它是 involuntary global :
for (item of data) {
// ^^^^
把它变成
for (const item of data) {
// ^^^^
并且始终启用严格模式!
关于javascript - promise 搞砸了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988909/
我是一名优秀的程序员,十分优秀!