Javascript 在继续之前,请等待异步函数的值为$。each

Javascript 在继续之前,请等待异步函数的值为$。each,javascript,jquery,Javascript,Jquery,我做了以下代码 如果你继续拉小提琴,不断地敲打“run”,你会注意到每次的结果都是不同的(它们应该是相同的)。我正在努力完成两件事 如何确保年份键/val每次都在项[]上-现在不一致 我不想在transformData()期间更改标题。现在阵列正在修改中。。。我的尝试是transformData(titles.slice(0),items=>{),但它仍在被修改 const titles = [ { title: 'avatar' }, { title: 'jurassic' }

我做了以下代码

如果你继续拉小提琴,不断地敲打“run”,你会注意到每次的结果都是不同的(它们应该是相同的)。我正在努力完成两件事

  • 如何确保
    年份
    键/val每次都在
    项[]
    上-现在不一致

  • 我不想在
    transformData()
    期间更改
    标题。现在阵列正在修改中。。。我的尝试是
    transformData(titles.slice(0),items=>{
    ),但它仍在被修改

    const titles = [
        { title: 'avatar' },
        { title: 'jurassic' },
        { title: 'black panther' }
    ];
    
    transformData(titles.slice(0), items => {
        const problem = items.length !== titles.length;
        const debugg ={
            problem: problem,
            counts: {
                items: items.length, // echos 2
                titles: titles.length // echos 3
            },
            items: items, // echos an object with 3 arrays inspector shows length:3
            titles: titles // echos an object with 3 arrays inspector shows length:3
        };
        console.log('debugg', debugg)
        $('pre').text(JSON.stringify(debugg, null, 2))
    
    });
    
    function transformData(configs, next) {
        const self = this;
        const items = [];
        const last = configs.length;
        $.each(configs, function(i, config) {
            items.push(config);
            $.ajax({
                url: 'https://www.omdbapi.com/?apikey=f4e09aec&&t=' + items[i].title,
                type: 'GET',
                crossDomain: true,
                dataType: 'jsonp',
                success: function(results) {
                    if (results.Response != 'False') {
                        console.log(results);
                        items[i].year = results.Year;
                        if (i+1 === last) { next(items); }
                    }
                }
            });
        });
    }
    
  • 我已经更新了你的密码。 您的
    titles
    之所以得到更新,是因为
    titles
    数组和作为参数传递的数组引用了相同的对象。我不是推送相同的对象,而是创建新对象

    items.push({...config})
    
    const标题=[
    {标题:'阿凡达'},
    {标题:'侏罗纪'},
    {标题:'黑豹'}
    ];
    transformData(titles.slice(0),items=>{
    常量问题=items.length!==titles.length;
    常量调试={
    问题:问题,,
    计数:{
    items:items.length,//echos 2
    标题:titles.length//echos 3
    },
    items:items,//用3个数组回显对象,长度:3
    titles:titles//使用3个数组回显对象检查器显示长度:3
    };
    log('debugg',debugg)
    $('pre').text(JSON.stringify(debug,null,2))
    });
    函数转换数据(配置,下一步){
    const self=这个;
    常量项=[];
    const last=configs.length;
    常数p=[]
    $.each(配置、函数(i、配置){
    items.push({…config})
    p、 推送($.ajax)({
    网址:'https://www.omdbapi.com/?apikey=f4e09aec&&t=“+项目[i]。标题,
    键入:“GET”,
    跨域:是的,
    数据类型:“jsonp”
    }))
    })
    Promise.all(p).然后((值)=>{
    
    对于(var i=0;这是一个称为竞争条件的老问题。由于异步的性质,您无法确定调用结果返回的顺序。您需要按顺序执行每一个调用,我会通过
    wait
    等待它们(使用JS的
    async/wait
    语法)或
    Promise.all
    来建议。这看起来很有希望(明白了吗?)…很快就要试试了。