如何解决创建一个在变量未定义时解决的承诺
我正在尝试创建一个Promise,当变量不是 undefined 时解决。
代码示例
https://codesandbox.io/s/quizzical-feynman-ktvox?file=/src/index.js
let fetchedPromise = new Promise((resolve,reject) => {
const check = ()=>{
setTimeout(() =>{
console.log("checking")
if (dataFetched) resolve(dataFetched);
else check()
},100);
}
check()
});
const waitForDataFromAnotherComponent = async () => {
let result = await fetchedPromise;
console.log("Result: ",result);
};
const assignData = () => {
setTimeout(() => {
dataFetched = 1000;
console.log(dataFetched);
},5000)
};
waitForDataFromAnotherComponent();
assignData();
这行得通,但我发现它效率低下,因为它容易发生调用栈,并且似乎是错误的。
我尝试过的其他无效解决方案:
//-------------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这样的函数,该函数不依赖setTimeout
解决方法
使用Javascript代理解决
基本上,我将代理对象分配给侦听更改的dataFetched。
由于必须包含resolve()
let dataFetched
let x = {
aListener: function (val) {},set a(val) {
dataFetched = val;
this.aListener(val);
},get a() {
return dataFetched;
},registerListener: function (listener) {
this.aListener = listener;
}
};
let fetchedPromise = new Promise((resolve,reject) => {
x.registerListener(function (val) {
console.log("yeyyyyyyyyyyyyyyy");
if (dataFetched) resolve(dataFetched);
});
});
const waitForDataFromAnotherComponent = async () => {
let result = await fetchedPromise;
console.log("Result: ",result);
};
const assignData = async () => {
await new Promise((resolve,reject) =>
setTimeout(() => {
x.a = 1000;
console.log(dataFetched);
resolve(dataFetched);
},1000)
);
};
waitForDataFromAnotherComponent();
assignData();
编辑
实际上,可以将诺言的resolve()
功能外部化,但存在here所说的一些缺点
示例
let dataFetched
var promiseResolve,promiseReject;
let x = {
aListener: function (val) {
if (dataFetched) promiseResolve(dataFetched);
},reject) => {
promiseResolve = resolve;
promiseReject = reject;
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。