2017-07-17 106 views
0

在下面的函数中,我试图返回第二个异步调用的promise对象,但是typescript抱怨函数必须返回一个值。我不知道我怎么能做到这一点?我如何退还第二个承诺?返回第二个承诺TypeScript jquery承诺

private getSalesUrl<TServiceInput>(serviceCall: (args: TServiceInput) => JQueryPromise<IServiceResponseT>, args): JQueryPromise<any> { 
     serviceCall(args).done(result => { //1st async call 
      if (result.serviceOutput) { 
       if (result.serviceOutput.key === "URL") { 
        return tipsInterop.executeSalesRequest(result.serviceOutput.value); //2nd async call 
       } 
      } 
     }); 
    } 
+0

的'return'是serviceCall的')了'done'回调('掉了。你需要'返回serviceCall(...)'以便通过serviceCall返回内部返回... – marekful

+0

如果我返回serviceCall,那么getSalesUrl.done()将在第一个异步调用的上下文中执行。我想getSaleUrl.done()在第二次异步调用的上下文中执行。 –

+1

A)不要使用'done'或'fail',总是使用'then'。 B)你实际上并没有从'getSalesUrl'返回任何东西,但是你只从完成的回调函数返回 – Bergi

回答

0
  • 基于什么OP要求和SO的意见,我假设OP需要第二个请求的承诺,退还
  • 这不应该,因为它基本局限于打字稿或JavaScript Ajax调用
  • 这个例子的功能使用简单的JavaScript和jQuery AJAX请求

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return "This is the content of second call: id=>" + data2.id; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

注:

  • (如果返回从此数据调用它被包裹成一个新的承诺,通过@Bergi评论默认情况下)我回到裹成一个承诺第二个呼叫的数据
  • 这是通过拦截和传递数据
  • 其他的方式来传递第二个呼叫的数据的一种方法是回到promise2即使用return promise2代替return "This is the content of second call: id=>"+ data2.id;

下面是它如何出现,如果你return promise2;

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return promise2; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>