繁体   English   中英

如何避免异步javascript中的冗余代码?

[英]How to avoid redundant code in asynchronous javascript?

我正在将一些数据库代码从同步(LocalStorage)重写为异步(IndexedDB)。 我正在使用Alasql库和Promises。 我遇到的问题之一是异步执行操作时,有时似乎不可避免地避免了重复代码。

例如,我的同步(伪)代码可能是这样的(idExists,doUpdate和doInsert是数据库方法):

function insertOrUpdate(data,id)
{
    var result = null;
    if (!idExists(id)) // idExists returns a boolean
        result = doInsert(data,id); // doInsert returns an object
    else
        result = doUpdate(data,id); // doUpdate returns an object
    doSomething(result);
}

使用异步代码,它会变成这样:

function insertOrUpdate(data,id)
{
    var promise1 = idExists(id); // idExists returns a promise
    promise1.then( function(id_exists) {
        if (id_exists) {
            var promise2 = doInsert(data,id); // doInsert returns a promise
            promise2.then( function(result) {
                doSomething(result);
            });
        }
        else {
            var promise3 = doUpdate(data,id); // doUpdate returns a promise
            promise3.then( function(result) {
                doSomething(result);
            });
        }
    });
}

在这里,我必须在代码的两个地方调用doSomething 有办法避免这种情况吗? 如果以前曾问过这个问题,我对诺言和道歉还是陌生的,但是我找不到答案。

您可以从链接的回调中return承诺,然后将其插入到承诺链中。 您的代码可以并且应该被编写为:

function insertOrUpdate(data, id) {
    return idExists(id)
        .then(function (exists) {
            return exists ? doInsert(data, id) : doUpdate(data, id);
        })
        .then(doSomething);
}

doInsertdoUpdate doInsert将被链接到idExists的现有链中,因此最终的idExists .then(doSomething)将与它们的结果一起执行。

您可以将promise存储到变量中,并只调用一次doSomething:

function insertOrUpdate(data, id) {
  return idExists(id).then(function(id_exists) {
    var promise = id_exists ? doInsert(data, id) : doUpdate(data, id)
    return promise.then(doSomething)
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM