我有这样的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库这样可用于此吗?



someAsyncFunctionhere中的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')





示例代码someAsyncFunctionkeycloak :)

function someAsyncFunction() {
  return new Promise((resolve, reject) => {
    keycloak.updateToken(30)
      .success(resolve)
      .error(reject)
  })
}

07-28 05:49