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