Javascript 当一个承诺已经运行时,如何处理返回承诺?
我有一个javascript类,它当前进行一些异步调用,向DOM添加元素,然后调用用户回调。大概是这样的:Javascript 当一个承诺已经运行时,如何处理返回承诺?,javascript,asynchronous,promise,queue,Javascript,Asynchronous,Promise,Queue,我有一个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 = func
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
的多个调用
我现在正试图更新它,以利用javascriptsPromise
。上述代码将类似于:
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,它将调用包装到setInterval
检查状态。当然有更好的办法。有什么建议吗
让这更清楚。对api.load
的每次调用都必须返回Promise
或thenable
。第一个调用将启动异步方法。进一步调用需要返回一个承诺
,该承诺只能在初始的承诺
完成后才能解决或拒绝
只有在未向成功处理程序传递任何值时,链接承诺才会起作用(第一个
。然后()
可能不会返回相同的值)。承诺本身可以作为异步接收数据的替代
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
});
第一个调用将启动异步工作。后续调用(使用相同的形式)将链接,然后
s到返回的承诺。承诺完成后,它将继续将其解析值作为参数传递给传递给then()
makeAsyncCalls()。如果api.loaded
标志的唯一目的是防止冗余调用(get函数中的错误检查可以做到这一点),那么它就不需要了。我花了几次时间,但我想我理解了。如果我错了,请纠正我(我正在按顺序思考然后)。一旦初始的承诺
得到解决,它将保持该状态,因此对的任何调用都将自动调用成功处理程序,并使用异步结果
?我只需要保留并归还一份本地副本。你已经拿到了。它将使用makeAsyncCalls承诺解析的任何内容调用成功处理程序。不,这是关于承诺的不太常见的理解。它们不仅控制异步的流,还可以用作名词和占位符来表示尚未可用的数据。