Javascript 通过承诺链编译结果(JS继承/接口)
我正在构建一个存储提供程序,允许使用代码通过接口存储内容。考虑下面的代码片段是伪代码,因为我要去MCVE。我正试图获得下面的重要数据和重要密钥 在最低级别,我有一个baseService: 这就是事情开始变得棘手的地方:我有一个baseStorageClient: 但这家伙从来没有被直接使用过。我已经创建了这方面的实例,例如indexedDbClient: 这就是事情变得非常棘手的地方。我正在努力实现以下目标:Javascript 通过承诺链编译结果(JS继承/接口),javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我正在构建一个存储提供程序,允许使用代码通过接口存储内容。考虑下面的代码片段是伪代码,因为我要去MCVE。我正试图获得下面的重要数据和重要密钥 在最低级别,我有一个baseService: 这就是事情开始变得棘手的地方:我有一个baseStorageClient: 但这家伙从来没有被直接使用过。我已经创建了这方面的实例,例如indexedDbClient: 这就是事情变得非常棘手的地方。我正在努力实现以下目标: storageInterface.storeMedia(superBuffer).
storageInterface.storeMedia(superBuffer).then(function (importantStuff) {
// this should go storeMedia > baseStorageClient > eventService
importantStuff.IMPORTANTKEY;
importantStuff.IMPORTANTDATA;
});
但我不太明白如何处理这件事。我如何沿着这样的承诺链编译结果?有两个主要问题: 您应该将“完成”和“失败”视为已弃用。它们不允许任何链接,它们将丢弃回调的结果。那就一直用吧 您的交易尚未返回任何承诺,因此您没有什么可依赖的。您需要首先执行以下操作:
function promiseFromRequest(req) {
return new Promise(function(resolve, reject) {
req.onsuccess = resolve;
req.onerror = reject;
});
}
现在您可以这样使用它:
storeMedia = function(blob){
return openDatabase().then(function () {
return promiseFromRequest(database.transaction(storeName, "readwrite")
.objectStore(storeName)
.add(dbEntry))
.then(function (event) {
logger.log("combined segments saved into database.");
return {
IMPORTANTKEY: dbEntry.mediaId
}
}, function (e) {
logger.log("Unable to save segments " + e);
throw e;
};
});
};
有了这些,您应该能够以某种方式查看storeMedia和storeMetaData的结果。太棒了!我不知道我可以用它来传递成功和失败回调-它将更新我的代码。我将如何处理“始终”-只需移动到另一个函数并调用2x?@SB2055这是最简单的,是的,还是用法
define(["baseStorageClient"], function(baseStorageClient){
const indexedDbClient = new baseStorageClient();
indexedDbClient.storeMedia = function(blob){
return openDatabase().then(function () {
const request = database.transaction(storeName, "readwrite")
.objectStore(storeName)
.add(dbEntry);
request.onsuccess = function (event) {
logger.log("combined segments saved into database.");
// todo - figure out how to resolve here
return {
IMPORTANTKEY: dbEntry.mediaId // <---- This too
}
};
request.onerror = function (event) {
// todo: figure out how to reject here
logger.log("Unable to save segments " + e);
};
});
}
})
define(["indexedDbClient"], function(indexedDbClient){
const storageInterface = {};
var currentClient = indexedDbClient; // might be other clients
storageInterface.storeMedia = function (blob) {
return currentClient.storeMedia(blob).then(function(mediaPath) {
return currentClient.storeMetadata(eventType, mediaPath);
});
}
});
storageInterface.storeMedia(superBuffer).then(function (importantStuff) {
// this should go storeMedia > baseStorageClient > eventService
importantStuff.IMPORTANTKEY;
importantStuff.IMPORTANTDATA;
});
sendRequest = function(data){
return $.ajax(data).then(function(response){
return response.IMPORTANTDATA;
}, function(response) {
throw new Error(response);
});
}
function promiseFromRequest(req) {
return new Promise(function(resolve, reject) {
req.onsuccess = resolve;
req.onerror = reject;
});
}
storeMedia = function(blob){
return openDatabase().then(function () {
return promiseFromRequest(database.transaction(storeName, "readwrite")
.objectStore(storeName)
.add(dbEntry))
.then(function (event) {
logger.log("combined segments saved into database.");
return {
IMPORTANTKEY: dbEntry.mediaId
}
}, function (e) {
logger.log("Unable to save segments " + e);
throw e;
};
});
};