Javascript:等待参数通过Return

时间:2017-04-15 12:54:40

标签: javascript jquery

我试图创建一个等待其属性首先响应然后继续其进程的函数。函数调用如下所示:

processResult(getResult());

问题是, getResult 函数在返回值之前需要时间,因为 theResult 函数为用户提供了三个按钮的接口,并且只返回一个如果用户点击按钮,则该函数如下所示:

function getResult() {
$(document.createElement('button'))
    .html("1")
    .click(function() {
      return 1;
    })
    .appendTo($(document.body));

$(document.createElement('button'))
    .html("2")
    .click(function() {
      return 2;
    })
    .appendTo($(document.body));

$(document.createElement('button'))
    .html("3")
    .click(function() {
      return 3;
    })
    .appendTo($(document.body));
}

processResult 函数如下所示,这只是一个例子:

function processResult(arg) {
  alert(arg);
}

当我加载网站时,函数调用 undefinied ,我知道这种行为是Javascript异步行为的结果,但我不知道如何改进我的代码, processResult 函数等待返回 getResult 函数。

我希望你能帮助我,谢谢你



<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
	function getResult() {
  	$(document.createElement('button'))
    	.html("1")
      .click(function() {
      	return 1;
      })
      .appendTo($(document.body));
      
    $(document.createElement('button'))
    	.html("2")
      .click(function() {
      	return 2;
      })
      .appendTo($(document.body));
      
    $(document.createElement('button'))
    	.html("3")
      .click(function() {
      	return 3;
      })
      .appendTo($(document.body));
  }
  
  function processResult(arg) {
  	alert(arg);
  }
  
  processResult(getResult());
</script>
</head>
<body>


</body>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

这就是回调的用途:

function getResult(callback) {
$(document.createElement('button'))
   .html("1")
   .click(function() {
      callback(1);
   })
.appendTo($(document.body));

$(document.createElement('button'))
  .html("2")
  .click(function() {
     callback(2);
 })
.appendTo($(document.body));

$(document.createElement('button'))
   .html("3")
   .click(function() {
      callback(3);
    })
 .appendTo($(document.body));
}

然后做:

getResult(processResult);

顺便说一下,你的 return 会返回jquery函数并且什么都不做......

你可以 - 如果你有更大的js知识 - 看看js Promises。他们很棒......

缩短代码:

function getResult(callback) {
for(var i=1;i<4;i++){
(function(i){
$(document.createElement('button'))
   .html(i+"")
   .click(function() {
      callback(i);
   })
.appendTo($(document.body));
})(i);
}
}

解决方法

如果你真的需要坚持'processResult(getResult());',你可以这样做(不推荐):

function getResult() {
var main={callback:function(){}};
for(var i=1;i<4;i++){
(function(i){
$(document.createElement('button'))
   .html(i+"")
   .click(function() {
      main.callback(i);
   })
.appendTo($(document.body));
})(i);
}
return main;
}
function processResult(cb){
  cb.callback=function(a){
    //your code
  };
}

答案 1 :(得分:0)

如果我理解你的问题,我会以不同的方式解决。创建所有按钮后,只需向所有按钮添加一些事件侦听器。该函数读取按钮的HTML并将其传递给您的函数。根据您的实际应用程序,您可能需要稍微调整一下。 ;)

$('button').click(function() { processResult($(this).text()) });