我在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”)。
答案 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 !"
});