如何在javascript

时间:2018-05-08 06:39:40

标签: javascript requirejs settimeout

我在javascript中有一个对象:

var a = {
    n1: 1,
    n2: 2
}

我希望得到a.n3的值,但稍后会将n3添加到对象中。

如何在不使用任何循环的情况下获取n3的值并导致任何错误?

修改

对象a是一个容器,来自不同作用域的不同脚本正在异步添加变量(我使用requireJS来维护脚本)。

我的一个脚本init.js希望从对象获取属性n3,但属性n3由另一个脚本swatchRenderer.js添加到对象中,不幸的是,在 init.js之后被称为。因此,init.js脚本未获得值n3

那么有没有办法停止在init.js中取值。

注意:我无法更改脚本的加载顺序。

5 个答案:

答案 0 :(得分:0)

如果对象a.n3中不存在,则undefined的值将为a。因此,您可以使用if条件来防止错误。

var a = {
    n1: 1,
    n2: 2
}

if(a.n3){
  console.log('value found first');
}
a.n3 = 10;
if(a.n3){
  console.log('value found second');
}

但是我们可以说n3boolean值,那么此if条件将无效,因此最好的方法是检查类型undefined,< / p>

var a = {
    n1: 1,
    n2: 2
}

if(typeof a.n3 !== 'undefined'){
  console.log('value found first');
}
a.n3 = false;
if(typeof a.n3 !== 'undefined'){
  console.log('value found second');
}

答案 1 :(得分:0)

var value = a.n3;

如果值未定义,则n3尚未定义,如果已定义,则得到它是值。

答案 2 :(得分:0)

如果要在更改n3时给定新值const a = { n1: 1, n2: 2, get n3() { return this._n3; }, set n3(val) { this._n3 = val; console.log('saw change, new val: ' + val); }, }; console.log('start'); a.n3 = 'foo'; console.log('end');运行函数,则一个选项是使用getter / setter:

&#13;
&#13;
{{1}}
&#13;
&#13;
&#13;

但这通常不能依赖 - 当对象发生变化时触发外部事物会更好。

MDN

的更多详细信息/示例

答案 3 :(得分:0)

使用JavaScript的此功能(仅此示例)

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}
var obj = {
	n1: 2,
	n2: 3
}
async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log(result);
  if (obj.n3) {
  	 console.log("obj.n3 found");
     //Here do your task
     return;
  }else {
  	asyncCall();
  }
  // expected output: "resolved"
}

asyncCall();

答案 4 :(得分:0)

因为您说您的脚本是先加载的。您可以做的是每隔x秒继续获取值,直到找到该值。

示例

var fetchN3 = function () {
    if (obj.n3 === undefined){
        return setTimeout(function() {
            fetchN3();
        }, 500);
    }
    console.log("Found N3!!!", obj.n3);
}