Javascript 当一个承诺已经运行时,如何处理返回承诺?

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

我有一个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,它将调用包装到
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承诺解析的任何内容调用成功处理程序。不,这是关于承诺的不太常见的理解。它们不仅控制异步的流,还可以用作名词和占位符来表示尚未可用的数据。