Javascript承诺范围问题?

时间:2017-06-29 11:30:47

标签: javascript scope promise

我认为我遇到了以下问题,我的印象是这应该返回一个包含100个字母的字符串,然后是100 b' s,但是在调用时:

  const otherm = require("./testpromise.js")

console.log("calling promise now")

otherm.daycent_promise("me","lol").then(function(res,err){
  console.log(res);
  if(err!=null){
    console.log("there was an error"+err)
  }
}) 

来自另一个档案:

module.exports={
  daycent_promise: function (username,password){
    return somefunction(username,password)
  }
}


var somefunction = function(username, password){
  return new Promise(function(resolve,reject){
    if(username=="me"){
      var str = "";
      for(i=0;i<100; i++){
        str=str.concat("a")
      }
      for(x=0;x<100;x++){
        //console.log("testing")
        addgo(str)
        //str=str.concat("b");
      }
    }

resolve(str);
  })
}


function addgo(str){
  //console.log("testing")
str=str.concat("b");
  return str
}

但即使addgo()正在运行,我得到的是100 a的输出。这里发生了什么?

2 个答案:

答案 0 :(得分:1)

字符串按值传递。而你无法改变字符串,每次修改都会创建一个新的字符串。所以当你这样做时:

addgo(str);//passes ""
console.log(str);//still "" never changed

function addgo(str){//own variable containing ""
 //console.log("testing")
 str=str.concat("b");//internal str is now "b"
  return str;//never used
}

解决方案:

str=addgo(str);//str is overriden with "b"

顺便说一句,更容易:

async function somefunction(username,password){
 return username==="me"?"a".repeat(100)+" b".repeat(100):undefined;
}

答案 1 :(得分:1)

将str替换为来自addgo的结果

 for(x=0;x<100;x++){
    //console.log("testing")
   str=addgo(str)
    //str=str.concat("b");
  }