我想创建一个监听器函数来监听全局变量的变化。用例是,当我进行ajax调用时,我将isAjaxDone
变量标记为false
,一旦完成将其标记为true
。因此,一旦检测到isAjaxDone
为true
,侦听器将处理某些内容。
我尝试了asyc ... await
和Promise
,但是我仍然无法实现自己想要的目标。除了asyc ... await
和Promise
内部的方法之外,整个方法仍在外部异步运行。
这是我尝试过的:
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
也是如此。
我想让它等到返回超时或仅布尔值,请告知。
答案 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();
})()