繁体   English   中英

等待异步操作的结果

[英]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

我可以自由更改您的代码。

我的方法是尽可能地分离代码,以免陷入“ 回调地狱”

  1. 创建someAsyncFunction并根据需要进行判断,然后返回其值

  2. 同样适用于您的ajax调用。 如果需要来自someAsyncFunction的输出,那么也很容易发送它们

  3. 承诺胜利! 链接所有调用并保持代码流:)

我正在使用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)
  })
}

好的,我知道您的问题出在哪里。 道歉没有考虑清楚。 $.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM