[英]Wait for result of async operation
我有这样的API用于异步请求
request(pathParams, params, method, callback, error) {
...........
return $.ajax({
...requestAttrs,
url: url,
data: params,
xhrFields: {
withCredentials: true
},
type: method,
success: callback,
error: error
})
}
但是由于某些要求,我需要将其更改为
request(pathParams, params, method, callback, error) {
...........
someAsyncFunction(function(){
return $.ajax({
...requestAttrs,
url: url,
data: params,
xhrFields: {
withCredentials: true
},
type: method,
success: callback,
error: error
})
})
}
我希望你看到我的问题。 在前一种情况下,我使用了$.ajax
调用返回的值-例如,因为我将取消这些请求。
但是现在当我需要将ajax函数放入另一个异步函数中时,我无法像以前一样返回$ .ajax值(因为现在我将return移动到了someAsyncFunction
内部)。
有没有办法我可以先在请求中运行someAsyncFunction
,等待其完成,然后像以前一样返回$.ajax
?
像stratified.js库这样可用于此吗?
someAsyncFunction
是来自此处的 updateToken
函数。 基本上,我需要将之前request
放入updateToken
的成功回调中,但是问题是我现在不能像以前那样返回$ajax
。
我可以自由更改您的代码。
我的方法是尽可能地分离代码,以免陷入“ 回调地狱” 。
创建someAsyncFunction
并根据需要进行判断,然后返回其值
同样适用于您的ajax
调用。 如果需要来自someAsyncFunction
的输出,那么也很容易发送它们
承诺胜利! 链接所有调用并保持代码流:)
我正在使用setTimeout
所以它们看起来是异步的
function someAsyncFunction() { return new Promise(resolve => setTimeout(() => { console.log('-> someAsyncFunction has finished') const token = 'abc123' resolve(token) }, 1000) ) } function executeAjaxRequest(pathParams, params, method, token) { return new Promise(resolve => { setTimeout(() => { console.log('-> executeAjaxRequest has finished') resolve() }, 2000) }) } function request(pathParams, params, method) { someAsyncFunction() .then((token) => executeAjaxRequest(pathParams, params, method, token)) .then(() => console.log('-> end!')) } request('pathParams', 'params', 'method')
示例代码someAsyncFunction
和keycloak
东西:)
function someAsyncFunction() {
return new Promise((resolve, reject) => {
keycloak.updateToken(30)
.success(resolve)
.error(reject)
})
}
好的,我知道您的问题出在哪里。 道歉没有考虑清楚。 $.ajax
返回的jqXHR以两种方式起作用:既作为承诺,又作为可以在完成之前中止它的句柄。 第一个要求我们返回它,以便我们可以继续承诺链。 第二个要求我们保留它,以便我们可以在承诺链之外实现它。
function authenticateWithKeycloak() {
return new Promise((resolve, reject) => {
keycloak.updateToken(30)
.success(resolve)
.error(reject)
})
}
function request(...) {
let promise = authenticateWithKeycloak();
promise.abort = () => { promise.aborted = true; }
return promise.then(authenticated => {
if (!promise.aborted) {
let xhr = $.ajax({...});
promise.abort = () => xhr.abort();
}
return promise;
})
}
let reqPromise = request(...);
reqPromise.then(...);
reqPromise.abort();
编辑:允许在AJAX之前中止。
您可能想要这样做。 希望这适合您的情况。 如果我误解了,请在评论中输入。
在这里,我只是返回了一个字符串,您可以编辑以返回ajax请求。
function someAsyncFunction(callback) { //do something return callback(); } function request(pathParams, params, method, callback, error) { return someAsyncFunction(function(){ return "Ajax request"; }); } console.log(request());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.