Javascript在函数中同步运行异步方法

时间:2019-01-28 03:22:23

标签: javascript

我想创建一个监听器函数来监听全局变量的变化。用例是,当我进行ajax调用时,我将isAjaxDone变量标记为false,一旦完成将其标记为true。因此,一旦检测到isAjaxDonetrue,侦听器将处理某些内容。

我尝试了asyc ... awaitPromise,但是我仍然无法实现自己想要的目标。除了asyc ... awaitPromise内部的方法之外,整个方法仍在外部异步运行。

这是我尝试过的:

var isAjaxDone = null
var timeout = 0
function listener(){
  let waiter = function(){
    return new Promise(resolve=>{
      setTimeout(() => {
        timeout += 1
        listener()
      }, 100);
    })
  }

  if(isAjaxDone) return true
  if(isAjaxDone === null) return false 
  if(isAjaxDone === false){
    if(timeout < 300){
      return waiter()
    }
    else{
      return "timeout"
    }
  }
}

实施:

function checker(){
  var ajaxStatus = listner()
  if(ajaxStatus){
    //...
  }
}

当我致电isAjaxDone时,它将返回Promise函数而不是布尔值。

我更不想使用Promise...then,因为我编写的函数被视为库,我不希望用户在then内包装一堆代码,因为这会给用户带来一些问题代码结构。 Callback也是如此。

我想让它等到返回超时或仅布尔值,请告知。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

Caused by: java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord

当然,我只需要编写一个post函数,然后在完成所有操作后执行一个函数,例如:

var xhr = new XMLHttpRequest;
xhr.open('POST', yourURLHere);
var promise = new Promise(function(resolve, reject){
  xhr.onload = function(){
    var o = JSON.parse(this.responseText); // should be `json_encode(['testProperty' => true])`ed response
    if(o.testProperty === true){
      resolve(true);
    }
    else{
      reject(false);
    }
  }
  xhr.send(formData); // you should get used to FormData
});
promise.then(function(resolveResult){
  yourGlobalVar = resolveResult;
});

现在您可以重复使用:

function post(url, formData, success, successContext){
  var xhr = new XMLHttpRequest;
  var c = successContext || this;
  xhr.open('POST', url);
  xhr.onload = function(){
    success.call(c, JSON.parse(xhr.responseText));
  }
  xhr.send(formData);
  return xhr;
}

答案 1 :(得分:1)

为什么不使用fetch这样已经可以等待的AJAX API?是polyfillable

const request = new Request('https://example.com', {method: 'POST', body: '{"foo": "bar"}'});
(async() => {
  const response = await fetch(request);
  return await response.json();
})()