我认为我遇到了以下问题,我的印象是这应该返回一个包含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的输出。这里发生了什么?
答案 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");
}