Rhino解释器中的JavaScript-函数返回未定义
我使用Blue嵌入式Rhino解释器(Csound的音乐创作环境)生成“乐谱”(音乐符号)。在蓝色中,您可以通过编写函数然后执行Rhino解释器中的JavaScript-函数返回未定义,javascript,rhino,csound,Javascript,Rhino,Csound,我使用Blue嵌入式Rhino解释器(Csound的音乐创作环境)生成“乐谱”(音乐符号)。在蓝色中,您可以通过编写函数然后执行 score = myFunction() 我的函数使用onLoad获取图像并提取像素信息,这些信息将用于生成分数。问题是我的函数没有足够的时间加载图像并在将其分配给变量之前返回数据。我尝试过使用setTimeout(),但没有用 我在浏览器中尝试了这一点,它确实返回“未定义” 基本上,我需要一种方法来延迟对score变量的赋值。这可能吗 多谢各位 function
score = myFunction()
我的函数使用onLoad获取图像并提取像素信息,这些信息将用于生成分数。问题是我的函数没有足够的时间加载图像并在将其分配给变量之前返回数据。我尝试过使用setTimeout(),但没有用
我在浏览器中尝试了这一点,它确实返回“未定义”
基本上,我需要一种方法来延迟对score变量的赋值。这可能吗
多谢各位
function score(){
var img = new Image();
img.src = "http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg";
img.crossOrigin = "Anonymous";
var score = "abc";
img.onload = function(){
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
score = "i1 0 2 440 0.5\n"
for (var i=0;i<imgData.data.length;i+=4){
score += "i1 + 0.1 " + (imgData.data[i] + 500).toString() + " 0.5\n"
}
return score;
}
}
score = score();
// TRY THIS IN BROWSER - RETURNS UNDEFINED
//console.log(score())
功能评分(){
var img=新图像();
img.src=”http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg";
img.crossOrigin=“匿名”;
var score=“abc”;
img.onload=函数(){
var canvas=document.createElement(“canvas”);
canvas.width=img.width;
canvas.height=img.height;
var ctx=canvas.getContext(“2d”);
ctx.drawImage(img,0,0);
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
score=“i1 0 2 440 0.5\n”
对于(var i=0;i您需要的是一个传入score函数的回调函数,该函数将在加载图像时触发:
// Adding a callback function as parameter
function score(callback){
var img = new Image();
img.src = "http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg";
img.crossOrigin = "Anonymous";
var score = "abc";
img.onload = function(){
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
score = "i1 0 2 440 0.5\n"
for (var i=0;i<imgData.data.length;i+=4)
{
score += "i1 + 0.1 " + (imgData.data[i] + 500).toString() + " 0.5\n"
}
// Now we can run the callback with our score data
return callback(score);
}
}
score(function(score){
console.log(score);
// Do your stuff with score data...
});
//添加回调函数作为参数
函数得分(回调){
var img=新图像();
img.src=”http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg";
img.crossOrigin=“匿名”;
var score=“abc”;
img.onload=函数(){
var canvas=document.createElement(“canvas”);
canvas.width=img.width;
canvas.height=img.height;
var ctx=canvas.getContext(“2d”);
ctx.drawImage(img,0,0);
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
score=“i1 0 2 440 0.5\n”
for(var i=0;i(《蓝色》的作者)
对于Blue,它实际上现在正在使用内置于Java8中的Nashorn(在新的Blue版本中,我已将该对象重命名为JavaScriptObject)
Nashorn提供了一个JS引擎,但据我所知,它并没有提供浏览器中所需的所有API。我运行并调试了您的代码,发现一些关于未定义“文档”和“图像”的异常被抛出。我使用Java对象重写了代码,例如:
function genScore(){
var url = new java.net.URL("http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg");
var img = javax.imageio.ImageIO.read(url);
score = "i1 0 2 440 0.5\n"
for (var i = 0; i < img.getHeight(); i++) {
for (var j = 0; j < img.getWidth(); j++) {
var rgb = img.getRGB(i, j);
score += "i1 + 0.1 " + (rgb + 500).toString() + " 0.5\n"
};
}
return score;
}
score = genScore();
函数genScore(){
var url=新的java.net.url(“http://static.webshopapp.com/shops/023001/files/024718445/256x256x2/major-dog-barbell-mini.jpg");
var img=javax.imageio.imageio.read(url);
score=“i1 0 2 440 0.5\n”
对于(var i=0;i
如果我理解正确的话,我认为您的代码只使用了红色值;必须使用位掩码和移位来修改此代码,以便从RGB中仅获得R值;有关Java的BuffereImage类的更多信息,请访问).谢谢您的回复,这在浏览器中很有吸引力,但是蓝色的就不行了,它需要在主程序中采用score=myFunction()的形式(赋值需要在任何函数之外进行)。你认为我有什么办法可以做到这一点吗?异步调用的本质要求你使用回调函数来获取结果。不幸的是,我不熟悉Rhino和Blue platform,以便在这方面提供更多帮助。你必须将score=myFunction()放在匿名函数中(控制台。log(得分)现在坐在上面的代码中)或者考虑使用承诺,如果可用的话。另外,蓝色代码看起来只是向应用程序日志打印异常数据,这使得这很难调试。我已经修改了2.7.0的蓝色,以便它会向用户报告像这样的代码问题。