首页 > 解决方案 > 承诺搞砸了?

问题描述

在过去的几天里,这个问题一直让我发疯。我远非 Javascript 专家,也许解决方案很明显,但我看不到。

我基本上尝试做的是:

  1. 并行下载项目,每个请求都是针对具有不同属性的给定项目类型(type1,type2)发出的。
  2. 下载后,执行回调函数对数据进行后处理(这是同一个函数,但参数不同,并测试项目类型,以便进行不同的处理)
  3. 保存项目

如果我下载 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会发生变化。

任何帮助将不胜感激。

谢谢!

标签: javascriptpromiseasync-await

解决方案


我在我的代码中没有看到任何可以解释类型为什么会发生变化的全局内容。

这并不是type在改变。你的问题是item这是一个非自愿的全局

for (item of data) {
//   ^^^^

让它成为

for (const item of data) {
//   ^^^^

并始终启用严格模式!


推荐阅读