0
function squre(val) {
    main.add(val,function(result){
        console.log("squre = " + result); //returns 100 (2nd line of output)
        return result;
    });
}

console.log(squre(10));  // returns null (1st line of output)

我需要 100 作为两条线的输出。

4

2 回答 2

0

您不能,因为您拥有 main.add()将在事件循环的当前刻度之外执行的异步函数(有关更多信息,请参阅本文)。squre(10)函数调用的值为undefined,因为此函数不会同步返回任何内容。请看这段代码:

function squre(val) {
    main.add(val,function(result){
        console.log("squre = " + result);
        return result;
    });

    return true; // Here is the value really returned by 'squre'
}

console.log(source(10)) // will output 'true'

节点的艺术以获取有关回调的更多信息。

要从异步函数取回数据,您需要给它一个回调:

function squre(val, callback) {
  main.add(val, function(res) {
    // do something
    callback(null, res) // send back data to the original callback, reporting no error
}

source(10, function (res) { // define the callback here
  console.log(res);
});
于 2013-11-08T09:13:16.817 回答
0

而是取决于的性质main.add()。但是,通过使用回调,它很可能是异步的。如果是这种情况,那么return根本无法正常工作,因为“异步”意味着代码不会等待result可用。

您应该通读“如何从 AJAX 调用返回响应? ”。尽管它使用 Ajax 作为示例,但它包含对异步编程和控制流可用选项的非常透彻的解释。

您需要定义squre()接受它自己的回调并调整调用代码以提供一个:

function squre(val, callback) {
    main.add(val, function (result) {
        console.log("squre = " + result);
        callback(result);
    });
});

squre(10, function (result) {
    console.log(result);
});

但是,如果main.add()实际上是同步的,您会想要移动return语句。他们只能适用于function他们直接在其中,这将是匿名的function而不是spure().

function squre(val) {
    var answer;
    main.add(val, function (result) {
        console.log("squre = " + result);
        answer = result;
    });
    return answer;
}
于 2013-11-08T09:14:48.813 回答