如何使用Promise在函数内完成等事件然后再调用这个函数?

时间:2017-04-21 14:16:05

标签: 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
         });
    }

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

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(“store1”)的onUpgradeneed或onSuccess完成之后调用initDataStore(“store2”)。

1 个答案:

答案 0 :(得分:0)

不,它不会工作。你实际上让upgradeneed和success事件函数返回一个promise,但实际上你不能让initDataStore返回任何东西...

承诺以这种方式工作:

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 !"
});