我有一个javascript类,它当前会进行一些异步调用,向DOM添加元素然后调用用户回调。像这样:
api.load = function() {
if (api.loading || api.loaded)
return;
api.loading = true;
makeAsyncCalls(); // will set api.loaded = true and run all pendingReady
}
api.ready = function(callback) {
if (!api.loaded) {
pendingReady.push(callback);
}
callback(someValue);
}
这允许我处理对load
和ready
的多次调用。
我现在正在尝试更新此内容以使用javascripts Promise
。上面的代码将变成类似:
api.load = function() {
if (api.loaded) {
// callers attached .then() will still fire
return Promise.resolve(someValue);
}
if (api.loading) {
// Not sure how to handle this
}
api.loading = true;
return makeAsyncCalls(); // Which returns a Promise
}
我不知道如何处理第一个Promise已启动但尚未完全加载的情况(在promise演讲中解决)。我能想到的唯一方法是返回一个Promise,它包含对setInterval
调用状态的调用。当然有更好的方法。有什么建议吗?
使这更清楚。每次致api.load
的电话都必须返回Promise
或thenable
。第一个调用将启动异步方法。进一步的通话需要返回Promise
,这只能在初始Promise
完成后才能解决或拒绝。
链接promises只有在没有值传递给成功处理程序时才会起作用(第一个.then()
可能不会返回相同的值)。
答案 0 :(得分:1)
承诺本身可以成为异步接收数据的替身......
api.getAsyncResult = function() {
if (!api.asyncResult) {
api.asyncResult = makeAsyncCalls();
}
return api.asyncResult;
}
现在任何数量的来电者都可以说:
api.getAsyncResult().then(function(result) {
// use result, which is whatever makeAsyncCalls's promise resolves to
});
第一个电话将启动异步工作。后续调用(使用相同的表单)将then
链接到返回的promise。承诺完成后,它将继续将其解析后的值作为传递给then()
的函数的参数
如果需要,makeAsyncCalls()
函数可以保持api.loading
标志的状态。如果api.loaded
标志的唯一目的是防止冗余呼叫(get函数中的假检查就是这样),则不需要Table A with columns user_id, free_data, used_data
Table B with columns donor_id, receptor_id, share_data
标志。