我有这样的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
是here中的updateToken
函数。基本上,我需要将之前在request
中的内容放入updateToken
的成功回调中-但是问题是我现在不能像以前一样返回$ajax
。 最佳答案
我可以自由更改您的代码。
我的方法是尽可能地分隔代码,这样您就不必陷入Callback Hell了。
创建someAsyncFunction
并做出您认为必要的任何事情,然后可以返回其值
同样适用于您的ajax
呼叫。如果需要someAsyncFunction
的输出,则也很容易发送它们
Promise为胜利!链接所有调用,并保持代码流:)
我正在使用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)
})
}