Javascript Meteor.setTimeout在超时后返回

Javascript Meteor.setTimeout在超时后返回,javascript,node.js,meteor,Javascript,Node.js,Meteor,我有这个开关箱 var res=null; switch(case){ case "Delay": console.log("Start Delay"); var timer = Meteor.setTimeout(function(){ console.log("done Delay"); res="sample"; },15000); console.log("test Delay

我有这个开关箱

var res=null;
switch(case){
case "Delay":
        console.log("Start Delay");
        var timer = Meteor.setTimeout(function(){
            console.log("done Delay");
            res="sample";
        },15000);
        console.log("test Delay");
        break;
}
return res;
上述代码将记录“启动延迟”和“测试延迟”。然后它将启动计时器。15000ms后,将记录“完成延迟”。这里的问题是res变量的返回。在计时器启动之前,它已经返回res,res为空

超时后如何返回变量

我还尝试了建议的答案,这是我的超时和睡眠功能代码

var timeout = function(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
var sleep = async function(fn, ...args) {
    await timeout(3000);
    return fn(...args);
}
我换了开关箱

var res=null;
switch(case){
case "Delay":
        console.log("Start Delay");
        sleep(function(){
            console.log("done Delay");
            res="sample";
        },15000);
        console.log("test Delay");
        break;
}
return res;

但是res变量仍然返回null而不是“sample”

您的switch语句是异步的,在返回响应之前不会等待超时完成

在这种情况下,您应该使用回调函数。下面是一个粗略的例子,说明您可能要实现的目标:

 var WorkWithResponse = function(response){
   console.log(response)
 }

var res=null;
var TestResponse = function(x, callback){

    switch(x){
    case "Delay":
            console.log("Start Delay");

            //This is the AngularJS $timeout service, 
            //replace with your own Meteor timeout method

            $timeout(function(){
              console.log('Delay over')
              res="Response Here";
              callback(res);
            },5000)
            console.log("test Delay");
            break;
    }
    return res;
}

TestResponse("Delay",WorkWithResponse)

我使用了npm的纤维/未来包装。此包允许函数在返回值之前等待其异步调用

基本上,你想要一个同步睡眠。查看如何使用开关盒的等待睡眠?您可以使用
await sleep(15000)取代了上面的
“延迟”
代码。我在问题中添加了更多解释。