【问题标题】:assign function return value to some variable using javascript使用javascript将函数返回值分配给某个变量
【发布时间】:2010-10-15 10:27:32
【问题描述】:

我有一个js函数,在做了一些业务逻辑之后,javascript函数应该返回一些结果给另一个变量。下面的示例代码

var response="";
function doSomething() {  
    $.ajax({
        url:'action.php',
        type: "POST",
        data: dataString,
        success: function (txtBack) { 
            if(txtBack==1) {
                status=1;
            }
    });
    return status;     
}

这里我想用like

response=doSomething();

我想分配一个返回值“status”“var response”。但是结果是'undefined'。

【问题讨论】:

  • 已经在你的标题中得到了正确的措辞:return value。但是你没有在你的函数中使用return ;)
  • 请注意,如果这些值是虚假的(即空字符串),通常不需要使用值初始化新变量。你可以写: var response;在这种情况下,response 的值将被设置为未定义的值(这也是一个假值)。然后,当您想检查该值是否已设置时,您可以检查它是否为假...
  • @Felix:我在函数内部有一个 ajax 调用,它返回“未定义”。任何的想法?谢谢
  • 在此处搜索有关此问题的 SO。这很正常。您不能从 Ajax 调用返回值,因为它是异步执行的,即 return 语句在 Ajax 调用完成之前执行。你可以使用回调来解决这个问题...
  • @Felix:嗨,我对代码做了一点改动,成功后,我只包含“async :false”....现在代码可以正常工作了:)跨度>

标签: jquery


【解决方案1】:

或者只是……

var response = (function() {
    var a;
    // calculate a
    return a;
})();  

在这种情况下,响应变量接收函数的返回值。该函数立即执行。

如果您想用需要计算的值填充变量,则可以使用此构造。请注意,所有计算都发生在匿名函数内部,因此您不会污染全局命名空间。

【讨论】:

  • 出于好奇,这被称为立即调用的函数 express (IIFE)。这太棒了。
  • 请注意,函数本身在括号内(在单词function 之前有一个左括号),最后还有一个额外的()。 (乍一看并不明显)
  • 如何使用这种语法传递参数?
  • @LeonardNiehaus (function(w) { /*…*/ })(window)
【解决方案2】:

AJAX 请求是异步的。正在执行您的 doSomething 函数,正在发出 AJAX 请求,但它是异步发生的;所以 doSomething 的剩余部分被执行,status 的值在返回时是未定义的。

实际上,您的代码的工作方式如下:

function doSomething(someargums) {
     return status;
}

var response = doSomething();

然后过了一段时间,你的 AJAX 请求就完成了;但是已经太晚了

您需要更改代码,并在 AJAX 请求的“成功”回调中填充“响应”变量。您将不得不延迟使用响应,直到 AJAX 调用完成。

你以前可能有过的地方

var response = doSomething();

alert(response);

你应该这样做:

function doSomething() {  
    $.ajax({
           url:'action.php',
           type: "POST",
           data: dataString,
           success: function (txtBack) { 
            alert(txtBack);
           })
    }); 
};

【讨论】:

    【解决方案3】:

    你可以简单地从函数中返回一个值:

    var response = 0;
    
    function doSomething() {
        // some code
        return 10;
    }
    response = doSomething();
    

    【讨论】:

    • 它的工作...但我有 ajax 调用里面,在那个时候结果是'未定义'。任何的想法?请看修改后的示例代码。
    【解决方案4】:

    结果是undefined,因为$.ajax 运行异步操作。这意味着return status$.ajax 操作完成请求之前执行。

    您可以使用Promise 来获得感觉同步的语法。

    function doSomething() { 
        return new Promise((resolve, reject) => {
            $.ajax({
                url:'action.php',
                type: "POST",
                data: dataString,
                success: function (txtBack) { 
                    if(txtBack==1) {
                        resolve(1);
                    } else {
                        resolve(0);
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    reject(textStatus);
                }
            });
        });
    }
    

    你可以这样调用promise

    doSomething.then(function (result) {
        console.log(result);
    }).catch(function (error) {
        console.error(error);
    });
    

    或者这个

    (async () => {
        try {
            let result = await doSomething();
            console.log(result);
        } catch (error) {
            console.error(error);
        }
    })();
    

    【讨论】:

      【解决方案5】:

      在您的上下文中检索正确值的唯一方法是同步运行 $.ajax() 函数(这实际上与主要的 AJAX 理念相矛盾)。有一个特殊的配置属性async 你应该设置为false。在这种情况下,实际包含 $.ajax() 函数调用的主作用域将暂停,直到同步函数完成,因此,return 仅在 $.ajax() 之后调用。

      function doSomething() {
          var status = 0;
          $.ajax({
              url: 'action.php',
              type: 'POST',
              data: dataString,
              async: false,
              success: function (txtBack) {
                  if (txtBack == 1)
                      status = 1;
              }
          });
      
          return status;
      }
      
      var response = doSomething();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        相关资源
        最近更新 更多