javascript - 如何使用 Promise 等待函数内的事件完成然后再次调用该函数?

标签 javascript events asynchronous async-await

我在 Javascript 中使用 dojo 并编写一个全局函数,其中包含异步函数。 我想连续调用这些函数两次,但我希望第一个调用在调用第二个之前完成。

我现在没有源代码,但结构如下。

initDataStore("store1");
initDataStore("store2");

 initDataStore : function(storeName){
         var request = openDB(storeName);
         request.onUpgradeneed(function(){
             //set some global value without return value
         });
         request.onSuccess(function(){
             //set some global value without return value
         });
    }

我只是尝试使用这样的 promise ,但我不确定它是否有效。

var p = Promise.resolve(initDataStore("store1"));
  p.then(function(){initDataStore("store2")});

     initDataStore : function(storeName){
             var request = openDB(storeName);
             request.onUpgradeneed(function(){
                 //set some global value without return value
               return new Promise(function (resolve, reject){resolve("success"});
             });
             request.onSuccess(function(){
                 //set some global value without return value
               return new Promise(function (resolve, reject){resolve("success"});
             });
        }

如何正确解决这些问题?

PS。我不需要任何返回值,我只想 initDataStore("store2") 在 onUpgradeneed 或 onSuccess initDataStore("store1") 完成后调用。

最佳答案

不,这行不通。你实际上让upgradeneed和success事件函数返回一个promise,但你实际上不让initDataStore返回任何东西......

Promise 是这样工作的:

function init(someParam){
   return new Promise(function(resolve, reject){
      // do something here
      // and call either resolve(someValue) or reject(someValue)
   });
}
init("aaa").then(function(val){/*success*/}, function(err){/*error*/});

这应该给我们以下内容:

function initDataStore(storeName){
   return new Promise(function(resolve, reject){
         var request = openDB(storeName);
         request.onUpgradeneed(function(){
             reject("Upgrade needed !");
         });
         request.onSuccess(function(){
             resolve("OK !");
         });
   });
}
initDataStore("store1").then(function(val){
   // val contains "OK !"
   initDataStore("store2").catch(function(err){/*second one did not work*/});
}, function(err){
   // first one did not work
   // err contains "Upgrade needed !"
});

关于javascript - 如何使用 Promise 等待函数内的事件完成然后再次调用该函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43544996/

相关文章:

javascript - 尝试在 JQuery 中执行 if/else 语句

javascript - 如何跟踪基于网络的登录和注销?

javascript - AngularJS:模糊事件未在表单验证指令中触发

c# - 在多项目中引发自定义事件

javascript - 如何根据条件加载外部 JavaScript

java - Spring Repository @Async Future<List<T>> 返回错误类型

php - 在 .js 页面中包含 Jquery 脚本

javascript - 在同一时刻多次调用函数,但在nodejs中延迟执行不同的调用

javascript - 如何知道光标何时停在某处?

c# .net 为什么 Task.Run 处理 Func<T> 的方式似乎与其他代码不同?