我正在用 HTML / JS 编写一个 Windows 8 应用程序,并在带有点击事件处理程序的表单上有一个按钮。单击按钮时,该按钮所做的第一件事是:
WinJS.Promise.then(openDB()).done(console.log("PROMISE DONE"));
openDB 函数如下所示:
function openDB() {
console.log("openDb...");
var req = indexedDB.open("MyDB", 1);
req.onsuccess = function(evt) {
var data = evt.target.result;
console.log("openDb DONE");
}
}
(我在 req 对象上也有 onerror 和 onupgradeneeded 回调,但为简洁起见将它们省略了)。
我显然误解了承诺应该如何工作,但我认为我可以在一个承诺上链接多个 THEN 调用,并且最终调用 DONE 只会在所有 THEN 调用都执行后才会触发。问题是控制台显示'openDb ...',然后是'PROMISE DONE',然后是'OpenDb done'。所以 DONE 调用是在 THEN 调用之前执行的。谁能解释为什么会这样?