如何访问我在运行时添加到对象的属性?

时间:2015-06-17 15:33:50

标签: javascript promise

enter image description here

在此示例中,我将属性“col_id_3”添加到Object。后来我想访问它。虽然我可以看到属性“col_id_3”(见图),我无法使用Object.col_id_3访问它。 JavaScript返回undefined。我怎样才能访问它?如何使该属性“粘贴”到对象上?

myFunction: function(){
      return db.allDocs({include_docs: true}, function(err, response) {
        var myArray =[];
        if(err) {
          console.log(err);
          throw new Error(console.error("error"));
        } else {

          return Promise.all(response.rows.map(function(row){           
            if(row.doc.type == 'myAttribute') {
              row.myNewlyAddedProperty = {id: row.doc._id,
                name: row.doc.data.name,
                isValid: false
              };

              myAsynchFunction(row.qc)
              .then(anotherAsynchFunction(row.qc), function(error) {
                console.error("handle error: "+error.stack);
                throw error;
              })
              .catch(function(error) {
                console.error("handle error in catch case: "+error.stack);
              });
            }
          }));
        }
      })
      .then(function (arrayResults) {
        var onlyFilteredResults = [];
        for (var i = 0; i < arrayResults.rows.length; i++){
          var changedInput = arrayResults.rows[i];
          if (arrayResults.rows[i].doc.type == 'myAttribute') {
            console.log(changedInput); // here I can see my newly add Attribute
            console.log(changedInput.myNewlyAddedProperty); // here I can't access my newly attribute anymore
            console.log(Object.keys(changedInput)); //here my newly added Attribute isn't listed

          }

1 个答案:

答案 0 :(得分:1)

console.log在扩展时显示对象的状态,而不是在日志时间。因此,changedInput在您单击以展开已记录对象时有myNewlyAddedProperty,但在您实际进行log调用时却没有。{/ p>

您的问题是您正在使用 回调和db.allDocs的承诺。假设您在此处使用PouchDB,则在回调运行之前会生成promise:

db.allDocs({}, function() { console.log("callback"); })
  .then(function() { console.log("promise") })

此代码将首先记录"promise",然后记录"callback"。因此,您的.then(function (arrayResults) { ... })正在db.allDocs(..., function(err, response) { ... })回调之前运行。这里的解决方案是不使用allDocs的回调并改为使用promise:

db.allDocs(...)
.then(function(response) {
    var myArray =[];
    ...
    return response;
})
.then(function (arrayResults) {
    var onlyFilteredResults = [];
    ...
});

此外,您的response.rows.map回调不会返回任何值,因此Promise.all会获得undefined值的数组。我假设你想要return myAsynchFunction(row.qc).then(...)