我需要创建一个JavaScript Promise,它在特定条件为真之前不会解析。假设我有一个第三方库,我需要等到该库中存在特定的数据条件。
我感兴趣的场景是这样一种场景:除了简单的轮询之外,没有办法知道这个条件何时得到满足。
我可以创建一个等待它的承诺--这段代码是有效的,但是有没有更好或更简洁的方法来解决这个问题呢?
function ensureFooIsSet() {
return new Promise(function (resolve, reject) {
waitForFoo(resolve);
});
}
function waitForFoo(resolve) {
if (!lib.foo) {
setTimeout(waitForFoo.bind(this, resolve), 30);
} else {
resolve();
}
}
用法:
ensureFooIsSet().then(function(){
...
});
我通常会实现一个最大轮询时间,但不希望在这里混淆问题。
6条答案
按热度按时间pbwdgjma1#
一个小的变化是使用一个命名的IIFE,这样你的代码会更简洁,避免污染外部作用域:
yyhrrdl82#
这是一个我经常使用的
waitFor
函数,你给它传递一个函数,它会检查并等待,直到函数返回一个真实值,或者直到它超时。示例用法:
完整版本:
这个版本比简单版本处理更多的情况,null、undefined、空数组等,有一个超时,一个频率可以作为参数传递,并将它对一些漂亮颜色的处理记录到控制台
quhf5bfb3#
有没有更简洁的方法来解决这个问题?
有了
waitForFoo
函数,构造函数中就不需要匿名函数了:为了避免污染作用域,我建议要么将两者都 Package 在IIFE中,要么将
waitForFoo
函数移到ensureFooIsSet
作用域中:或者,为了避免在
resolve
和reject
之间传递所需的绑定,您可以像@DenysSéguret建议的那样将其移动到Promise
构造函数回调中。有没有更好的办法?
就像@BenjaminGruenbaum评论的那样,你可以观察
.foo
属性的赋值,比如使用setter:您可以像
waitFor(lib, "foo", 5000)
一样使用它。t1rydlwq4#
下面是一个使用
async/await
和默认ES6 promise的实用函数,promiseFunction
是一个异步函数(或者只是一个返回promise的函数),如果满足要求,它将返回一个真实值(如下所示)。示例用法:
hs1rzwqc5#
13z8s7eq6#
很简单!等到一个变量有了X值。在这个例子中,我们等到zzz = 99。