【问题标题】:how to make Javascript setTimeout returns value in a function如何使Javascript setTimeout在函数中返回值
【发布时间】:2014-08-04 23:26:07
【问题描述】:

我有一个调用某些服务并返回响应的函数。如果响应为 FALSE,它会等待 1 秒以再次询问服务(然后可能返回 TRUE)。

我怎样才能调用我的函数“checkService()”一次,并获得真正的价值? (第一次或第二次尝试,由函数决定)我在函数内部设置了 RET 值,但函数总是返回第一个 RET,因为 setTimeout 是异步的。

换句话说,我需要一些“睡眠”技巧,或者任何解决方案(也可能是 jQuery)。

function checkService() {

  //this may return TRUE or FALSE
  var RET = someServiceResponse(); 

  // here waits 1 second, then ask the service again
  if( RET == true ) {
    return true;
  } else {

    setTimeout(
        function() {
            //it must return the second response of the service
            RET = someServiceResponse();  
        }, 
        1000
    );

    // I want the checkService() return the response after de timeout
    return RET;  
  }
}

function alertResponse() {
    alert( checkService() );
}

【问题讨论】:

  • someServiceResponse 是否从 ajax 调用中获取结果?这可能是您问题的核心。
  • 虽然 1 秒的等待似乎很有用,但如果调用需要更多时间才能返回,它很容易中断。我建议将此功能与实际传递响应时触发的回调函数分开。
  • 特拉维斯,没有。但是,我不介意等待时间超过 1 秒。时间不重要,只需要等待一些(半秒左右)再检查一下即可

标签: javascript asynchronous settimeout


【解决方案1】:

当您期望服务的结果时,您应该使用回调函数。

像这样:

function checkService(callback) {

    //this may return TRUE or FALSE
    var RET = someServiceResponse();

    // here waits 1 second, then ask the service again
    if( RET == true ) {
        callback(RET);
    } else {

        setTimeout(
                function() {
                    //it must return the second response of the service
                    RET = someServiceResponse();
                    callback(RET);
                },
                1000
        );

        // I want the checkService() return the response after de timeout
        return RET;
    }
}

所以当你想调用服务时,你只需要这样做:

checkService(function(status){
    alert(status);

    // Here some code after the webservice response
});

【讨论】:

  • 或者在超时函数中再次调用checkService()。无论哪种方式都应该工作。
  • 我使用了 alert() 来简化事情。实际上我需要从我的代码中的许多其他函数调用 checkService(),并根据 checkService() 的响应做任何需要的事情。如果我从外面再次调用它,我会做与 checkService() 相同的事情。那是因为我创建了函数 checkService()。
【解决方案2】:

谷歌搜索“javascript setTimeout 回调”这是一个方便的 jsFiddle,大约有 3 个结果:

getData('http://fakedomain1234.com/userlist', writeData);

document.getElementById('output').innerHTML += "show this before data ...";

function getData(dataURI, callback) {
    // Normally you would actually connect to a server here.
    // We're just going to simulate a 3-second delay.
    var timer = setTimeout(function () {
        var dataArray = [123, 456, 789, 012, 345, 678];
        callback(dataArray);
    }, 3000);
}

function writeData(myData) {
    console.log(myData);
}

http://jsfiddle.net/cwbuecheler/Y9Ca8/

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多