1

成功登录后,我想用新数据刷新我的 indexeddb 存储。数据刷新完成后,我想重定向到登陆页面。我的问题是我有 1000 多次调用 setItem 并且他们没有完成。

var app = {
Login: function () {
    WebService.Login($("#username").val(), $("#password").val())
        .then(function () {
            // TODO: refresh data and then redirect...
            UpdateData().then(function() {
                window.location.href = '/Home';
            });

        })
        .catch(function (err) {
            console.log("error logging in");
        });

},
UpdateData: function () {

    return fetch('/api/Customer').then(function (response) {
        return response.json();
    })
    .then(function (data) {
        var customerStore = localforage.createInstance({ name: "customers" });
        // Refresh data
        customerStore.clear().then(function () {
            data.forEach(function (c) {
                // How do I know when all setItem calls are complete??
                customerStore.setItem(String(c.CustomerID), c);
            });
        });
    })
    .catch(function (err) {
        console.log("Data error", err);
    });
}

}

我对 Promise 还比较陌生,但是必须有一种方法可以将所有 setItem 调用放入可以返回的 Promise.all() 中。我怎样才能做到这一点?

4

1 回答 1

1

我认为你需要这样的东西:

return fetch("/api/Customer")
.then(function(response) {
    return response.json();
})
.then(function(data) {
    var customerStore = localforage.createInstance({ name: "customers" });
    // Refresh data
    return customerStore.clear().then(function() {
        return Promise.all(
            data.map(function(c) {
                return customerStore.setItem(String(c.CustomerID), c);
            })
        );
    });
})
.catch(function(err) {
    console.log("Data error", err);
});

data.map将返回一组承诺,然后我们还返回聚合承诺(来自Promise.all)。

您还应该保留参考以customerStore供以后使用。此外,如果数据量很大,您可能希望使用localForage-setItems来提高操作的性能(但尽量避免可能的过早优化)。

于 2018-05-06T14:24:51.950 回答