Javascript 创建在变量未定义时解析的承诺
我试图创建一个承诺,当变量不是未定义时解决该问题 代码示例Javascript 创建在变量未定义时解析的承诺,javascript,promise,async-await,settimeout,Javascript,Promise,Async Await,Settimeout,我试图创建一个承诺,当变量不是未定义时解决该问题 代码示例 let dataFetched var promiseResolve, promiseReject; let x = { aListener: function (val) { if (dataFetched) promiseResolve(dataFetched); }, set a(val) { dataFetched = val; this.aListener(val); }, get a
let dataFetched
var promiseResolve, promiseReject;
let x = {
aListener: function (val) {
if (dataFetched) promiseResolve(dataFetched);
},
set a(val) {
dataFetched = val;
this.aListener(val);
},
get a() {
return dataFetched;
},
registerListener: function (listener) {
this.aListener = listener;
}
};
let fetchedPromise = new Promise((resolve, reject) => {
promiseResolve = resolve;
promiseReject = reject;
});
这是可行的,但我发现它效率低下,因为它容易调用堆栈,而且似乎是错误的
我尝试过的其他非工作解决方案:
//-------------SOLUTION 1
let fetchedPromise = new Promise((resolve, reject) => {
const check = ()=>{
if (dataFetched) resolve(dataFetched);
else check()
}
check()
});
//--------------------SOLUTION 2
let fetchedPromise = new Promise((resolve, reject) => {
if (dataFetched) resolve(dataFetched);
});
场景
我需要一个类似解决方案3的函数,它不依赖于使用Javascript代理解决的setTimeout 基本上,我将代理对象分配给侦听更改的dataFetched。 我重新创建了监听功能,因为它必须包括
resolve()
编辑
实际上,可以将promise的resolve()
函数外部化,但也有一些缺点
示例
let dataFetched
var promiseResolve, promiseReject;
let x = {
aListener: function (val) {
if (dataFetched) promiseResolve(dataFetched);
},
set a(val) {
dataFetched = val;
this.aListener(val);
},
get a() {
return dataFetched;
},
registerListener: function (listener) {
this.aListener = listener;
}
};
let fetchedPromise = new Promise((resolve, reject) => {
promiseResolve = resolve;
promiseReject = reject;
});
很可能是您想要的。
assignData
无法接受回调或返回承诺本身@Sirko我如何在代码中集成mutationObserverconst callback=function(observer){if(observer)console.log(“observer is”,observer)}const observer=newmutationobserver(callback)observer.observer(dataFetched);`这将返回观测者上的节点错误assignData
只是一个假函数,表示变量已更改。在我的“real”代码中,有一个函数为assignData
赋值,很明显,这是一个示例。我想确保您没有完全弄错树,没有错过像assignData()这样的简单选项。然后(…)
。
let dataFetched
var promiseResolve, promiseReject;
let x = {
aListener: function (val) {
if (dataFetched) promiseResolve(dataFetched);
},
set a(val) {
dataFetched = val;
this.aListener(val);
},
get a() {
return dataFetched;
},
registerListener: function (listener) {
this.aListener = listener;
}
};
let fetchedPromise = new Promise((resolve, reject) => {
promiseResolve = resolve;
promiseReject = reject;
});