【问题标题】:angular 2 Http service call with in for loop带有for循环的角度2 Http服务调用
【发布时间】:2017-11-10 06:56:00
【问题描述】:

我在 for 循环中调用 Angular 2 HTTP 服务时遇到问题。与服务调用相比,循环运行得很快,返回的结果太慢。

   this.projectService.addProjectServices(pid,rid,vname,field_name,ser_name).subscribe(
        pdata => {
          for(var k=0;k<pdata['revision_info'][0].office_info[0].vertical_info[index].service_selection_info.length;k++) // Find service index
          { 
              if(ser_name==pdata['revision_info'][0].office_info[0].vertical_info[index].service_selection_info[k].service_name)
              {
                s_index=k;
              }
          } 
          for(var k=0;k<pdata['revision_info'][0].building_info.length;k++)
          {
              var bid=pdata['revision_info'][0].building_info[k]._id;
              // Checked Building only inserted
              if($("#"+bid+sid).prop("checked") == true)
              {
                var bid=$("#"+bid+sid).attr('build-id');
                var build_name=$("#"+bid+sid).attr('build-name');
                var service_name=$("#"+bid+sid).attr('service-name');
                alert(build_name);
                  // Update
                  for(var n=0;n<pdata['revision_info'][0].office_info.length;n++) // inserted at single office or both office
                  { 
                    var field_name='revision_info.$.office_info.'+n+'.vertical_info.'+index+'.service_selection_info.'+s_index+'.serviceselect_building_info';

                    projectServiceRef.projectService.updateProjectServices(pid,rid,vname,field_name,service_name,bid,build_name).subscribe(
                      pdata => {
                        alert("updated");
                    });
                  }  
              }
          }});  

在上面的编码中,首先我调用了一个 HTTP 服务调用来添加一个特定的服务文档,然后我使用 for 循环找到了当前插入的服务的索引。下一个 for 循环是插入上述服务文档的子文档。这里第二个for循环跑的比较快,但是子文档的更新操作太延迟或者有些时候更新操作没有做完。任何人都可以帮助解决我的问题。

【问题讨论】:

    标签: node.js mongodb typescript angular2-services


    【解决方案1】:

    您可以使用批量更新功能:

    this.projectService.addProjectServices(pid, rid, vname, field_name, ser_name)
        .subscribe(pdata => {
    
            let _service_selection_info=pdata['revision_info'][0].office_info[0].vertical_info[index].service_selection_info;
            let _building_info=pdata['revision_info'][0].building_info;
            let _bulkQuery=[];
    
    
            // Find service index
            for (let k = 0; k < _service_selection_info.length; k++) {
                if (ser_name == _service_selection_info[k].service_name) {
                    s_index = k;
                }
            }
    
    
            for (let k = 0; k < _building_info.length; k++) {
                let bid = _building_info[k]._id;
                let bidEle=$("#" + bid + sid);
                // Checked Building only inserted
                if (bidEle.prop("checked") == true) {
                    let bid = bidEle.attr('build-id');
                    let build_name = bidEle.attr('build-name');
                    let service_name = bidEle.attr('service-name');
                    alert(build_name);
    
                    // Update
                    for (let n = 0; n < pdata['revision_info'][0].office_info.length; n++) {
                        let field_name = 'revision_info.$.office_info.' + n + '.vertical_info.' + index + '.service_selection_info.' + s_index + '.serviceselect_building_info';
    
                        // Array of objects will used for bulk insert on server.
                        _bulkQuery.push({
                           pid:pid,
                           rid: rid,
                           vname: vname,
                           field_name:field_name,
                           service_name:service_name,
                           bid:bid,
                           build_name:build_name
                       })
                    }
                }
             }
    
         projectServiceRef.projectService.updateProjectServices(_bulkQuery)
              .subscribe(pdata => {
                  alert("updated");
              });
      });
    

    批量更新的有用链接是:

    索尔:

    https://www.codeproject.com/Articles/53669/Bulk-INSERT-UPDATE-DELETE-in-LINQ-to-SQL

    https://www.aspsnippets.com/Articles/SqlBulkCopy--Bulk-Insert-records-and-Update-existing-rows-if-record-exists-using-C-and-VBNet.aspx

    蒙哥:

    https://docs.mongodb.com/manual/reference/method/Bulk.find.update/#Bulk.find.update

    Example <logic for bulk update in mongo>:
    
        var bulk = db.projects.initializeUnorderedBulkOp();
        _bulkQuery.forEach(function (q) {
            bulk.find( { pid: q.pid } )
                .update( { $set: {
                rid: q.rid,
                vname: q.vname,
                field_name:q.field_name,
                service_name:q.service_name,
                bid:q.bid,
                build_name:q.build_name
            } } );
        });
        bulk.execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多