Javascript何时完成和函数使用

Javascript何时完成和函数使用,javascript,jquery,Javascript,Jquery,我试图在第三个函数中调用两个不同的函数,但一个接一个。一个函数具有ajax调用,其值在另一个函数中使用。这是一个循序渐进的过程。我不想用一个来代替另一个 function f1() { // ajax call return r1 } function f2(r2) { // do some of the work based on r2 } function f3() { $.when(f1()).done(function(data){

我试图在第三个函数中调用两个不同的函数,但一个接一个。一个函数具有ajax调用,其值在另一个函数中使用。这是一个循序渐进的过程。我不想用一个来代替另一个

function f1()
{
    // ajax call 
    return r1
}

function f2(r2)
{
    // do some of the work based on r2
}

function f3()
{
    $.when(f1()).done(function(data){
            f2(data)

    });
}
我还尝试了$.when().then();但还是没有用

提前谢谢

更新:-以下是基于@dreamweiver提供的解决方案对我的问题的答案

var json_data = '';
function f1()
{

    $.ajax({
         url: "test.php",
         method: "POST",
         async : false,
         data: { },
         success:function(data){
            json_data = eval(data);
         }

       });  


}

function f2(t)
{

    console.log("values is "+t);
}

function f3()
{
    $.when(f1()).done(function(){
        f2(json_data);
   });
}

谢谢大家的反馈。

这应该是有效的:

function f1() {
    // Or some other Ajax request that returns a promise
    return $.getJSON('path/to/your/service');
}

function f2(r2) {
    // ...
}

f1().done(f2);

试着这样做,我已经在本地进行了测试,效果非常好

function deferredCalls () {
   var jsonData = '';
   var f1 = function ()
   {
       // ajax call 
       $.ajax({
         url: "test.html",
         method: "POST",
         data: { id : menuId }
       }).done(function(data) {
          jsonData = data; //set the data
       });
   }

   var f2 = function (data)
   {
     // do some of the work based on data
     if(!!data){
       //process the data
     }
   }
   $.when(f1).done(function(){
        f2(jsonData);
   });
 }

首先调用
f1
函数,该函数将发出ajax请求并在成功时返回数据,该数据被设置为函数范围变量
jsonData
。此过程完成后,将调用f2,f2将开始使用
jsonData
,它只是从
f1
函数调用接收到的数据。

您是否尝试了
$。何时(f1).完成(函数(数据){f2(数据)})
如果您使用的是jQuery的
ajax()
,那么您应该能够做到:
f1()。然后(f2)
。为什么需要f3函数?假设您想设定承诺,然后调用f1?您是否尝试过在调用
f1
后删除
()
?例如,
$.when(f1).done(…
)-如果使用
()
调用它,那么函数将立即执行。您可能应该做的是将其作为变量传递给jQuery执行later@James,我尝试了你的方法,但它显示“f1未定义”如果出现此错误,我将无法在其他一些函数中调用f1和f2。这不是问题,请将这些函数移到全局范围并保持其余函数不变。是否尝试将
f1=func….
f2=func….
的完整定义从
deferredCalls()移到全局范围
$。当
没有得到由$创建的承诺时。ajax。代码通常做的是:
$。当
调用
f1
时,
f1
返回未定义,
$。当
将其作为参数传递给对
.done
的匿名回调时,这将调用
f2
>jsonData尚未初始化(唯一的例外是ajax调用在f1中同步触发
.done
)all@vanhelgen,说得对。它有时做同样的事情,有时显示为“未定义”