为什么我的JS对象作为未定义值添加到Array?

时间:2018-06-26 15:33:11

标签: javascript arrays function object return

我有一个函数可以从JSON文件中获取一些值,并创建一个item对象。

var searchIndex = [];

function getSearchTerms(param){

  var filePath = 'json/' + param + '.json';

  $.getJSON(filePath, function( data ) {

      var item = {
        param: param,
        title: data.title,
        person: data.fname + ' ' + data.lname
      };

      // console.log(item);
      // searchIndex.push(item);

      return item;
  });

}

检查控制台时,我可以看到正在创建具有正确属性的item对象。

但是,当我尝试将对象添加到searchIndex数组中时,无论是在函数内还是在调用getSearchTerms函数的循环内,我都会得到具有正确行数的数组,但是所有值都是不确定的。

var contentFiles = [ 'a', 'b', 'c'];

for (var i = 0; i < contentFiles.length; i++) {
    searchIndex.push( getSearchTerms(contentFiles[i]) );
}

我在这里做错什么愚蠢的事?预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

请记住,从磁盘读取文件需要一点时间。数量不多,但是足以弄乱您要编写的少量代码。现在是您学习如何使用异步代码的好时机。这是对某些特定代码行的一些细微改动,可能会有所帮助。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    services.AddIdentity<MyUser, IdentityRole>()
         .AddUserStore<MyUserStore>()
         .AddRoleStore<MyRoleStore>()
         .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseAuthentication();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

在您的循环中...

async function getSearchTerms(param)
await var item

我不是专家,这是我所回答的第一个SO问题。您可能需要在其中插入.next之类的内容。如果这不起作用,请进一步研究异步/等待功能的概念。在您的代码中,您要推送尚未达到其实际值的对象,因为从磁盘读取需要一些时间。 JS无需等待就可以逐行移动,有时您的值需要一秒钟才能被整理出来。