Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过承诺链编译结果(JS继承/接口)_Javascript_Jquery_Ajax_Promise - Fatal编程技术网

Javascript 通过承诺链编译结果(JS继承/接口)

Javascript 通过承诺链编译结果(JS继承/接口),javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我正在构建一个存储提供程序,允许使用代码通过接口存储内容。考虑下面的代码片段是伪代码,因为我要去MCVE。我正试图获得下面的重要数据和重要密钥 在最低级别,我有一个baseService: 这就是事情开始变得棘手的地方:我有一个baseStorageClient: 但这家伙从来没有被直接使用过。我已经创建了这方面的实例,例如indexedDbClient: 这就是事情变得非常棘手的地方。我正在努力实现以下目标: storageInterface.storeMedia(superBuffer).

我正在构建一个存储提供程序,允许使用代码通过接口存储内容。考虑下面的代码片段是伪代码,因为我要去MCVE。我正试图获得下面的重要数据和重要密钥

在最低级别,我有一个baseService:

这就是事情开始变得棘手的地方:我有一个baseStorageClient:

但这家伙从来没有被直接使用过。我已经创建了这方面的实例,例如indexedDbClient:

这就是事情变得非常棘手的地方。我正在努力实现以下目标:

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