如何在已经运行时返回一个promise?

时间:2016-09-01 17:50:16

标签: 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 = function(callback) {
    if (!api.loaded) {
        pendingReady.push(callback);
    }
    callback(someValue);
}

这允许我处理对loadready的多次调用。

我现在正在尝试更新此内容以使用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的电话都必须返回Promisethenable。第一个调用将启动异步方法。进一步的通话需要返回Promise,这只能在初始Promise完成后才能解决或拒绝。

链接promises只有在没有值传递给成功处理程序时才会起作用(第一个.then()可能不会返回相同的值)。

1 个答案:

答案 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 标志。