Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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承诺链异步操作_Javascript_Promise_Es6 Promise - Fatal编程技术网

使用本机JavaScript承诺链异步操作

使用本机JavaScript承诺链异步操作,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我已经完成了以下两个异步操作,然后定义了最终的onResult和onFault。如何将以下两个异步操作链接到getConnection,然后选择并最终调用onResult或onFault 编辑需要帮助提示以下顺序 new Promise(this.getConnection) .then(this.select) .then(this.onResult) getConnection: function(resolve, reject) { con

我已经完成了以下两个异步操作,然后定义了最终的onResult和onFault。如何将以下两个异步操作链接到getConnection,然后选择并最终调用onResult或onFault

编辑需要帮助提示以下顺序

    new Promise(this.getConnection)
        .then(this.select)
        .then(this.onResult)

getConnection: function(resolve, reject) {
    console.log('get connection')
    if(database = common.model.connections.Sync.getConnection()) {
        database.transaction(function(transaction){
            resolve(transaction);
        });
    } else {
        reject("Connection Error");
    }
},

select: function(transaction) {
    console.log('select', transaction)
    var self = this;

    var query = "SELECT * FROM configuration WHERE key = 'schedule'";
    self.transaction.executeSql(query, [], function(transaction, resultSet){self.selectTransactionComplete(transaction, resultSet)}, function(){self.selectTransactionError()});
},

selectTransactionComplete: function(transaction, resultSet) {
    console.log('select transaction complete')
    if(resultSet.rows.length == 0) {
        this.onResult(false);
    } else if(new Date().getTime() - new Date(common.Config.getLastSync()).getTime() > resultSet.rows.item(0).value) {
        this.onResult(true);
    }
},

selectTransactionError: function(error) {console.log(this.constructor.NAME, this.selectSQL); console.log(error);},

onResult: function(data) {
    console.log(data);
},

onFault: function(info) {
    console.log(info)
}

在尝试了几件事情之后,这是应该怎么做的吗?请复习

    this.getConnection()
        .then(this.select, this.getConnectionError)
        .then(this.selectTransactionComplete, this.selectTransactionError)

getConnection: function() {
    console.log('get connection')

    var promise = new Promise(function(resolve, reject){
        try {
            database = common.model.connections.Sync.getConnection();
            database.transaction(function(transaction){
                resolve(transaction);
            });
        } catch(error) {
            reject("Connection Error");
        }
    });

    return promise;
},

getConnectionError: function(info) {
    console.log("connectionError");
    this.onFault();
},

select: function(transaction) {
    console.log('select')
    var self = this;

    var promise = new Promise(function(resolve, reject){
        var query = "SELECT * FROM configuration WHERE key = 'schedule'";
        transaction.executeSql(query, [], function(transaction, resultSet){resolve(resultSet)}, function(error){reject(error)});
    });

    return promise;
},

selectTransactionComplete: function(resultSet) {
    console.log('selectTransactionComplete')

    /*if(resultSet.rows.length == 0) {
        this.onResult(false);
    } else if(new Date().getTime() - new Date(common.Config.getLastSync()).getTime() > resultSet.rows.item(0).value) {
        this.onResult(true);
    }*/
},

selectTransactionError: function(error) {
    console.log('selectTransactionError')
    //console.log(this.constructor.NAME, this.selectSQL);
    //console.log(error);
},

onResult: function(data) {
    console.log('onResult')
},

onFault: function(info) {
    console.log('onFault')
}

如果您使用的是像这样的承诺库,那么链接承诺的方法如下所示

getConnection: function() {
    var deferred = Q.Defer();
    console.log('get connection')

        try {
            database = common.model.connections.Sync.getConnection();
            database.transaction(function(transaction){
                deferred.resolve(transaction);
            });
        } catch(error) {
            deferred.reject("Connection Error");
        }

    return deferred.promise;
}
当你打电话时,你会做如下的事情

Q.when(getConnection)
.then(function(result){
 // handle success or resolve
}, function(error){
 // handle rejection.
};

此外,我建议阅读

你似乎在使用回扣之类的承诺。不要;取而代之的是退回它们。例如,asyncAction应该返回一个承诺或传递两个参数,而这两个参数都不能直接抛出到then.removed asyncAction因为它不在范围内,我如何通过这两个异步操作从getConnection到达onResult调用-getConnection&select,就像这里排队异步操作感谢在我的示例中使用书面代码提供的任何帮助,我已经阅读了文章,理解了单个asyn,但仍然无法理解多个排队异步操作,我注意到了Promise。阅读了几篇文章后,我不确定这是否适用于我的情况,请在下面的回答中回顾我的尝试,这是应该的吗?感谢Jerome提供的代码,但是,我希望在本机JavaScript PromiseQ中也这样做。如果是冗余的,请调用getConnection。此外,如果你在新版本的Q中使用Q.Promise而不是延迟,你就不需要输入try/catch,它会帮你的。谢谢大家的评论。我可以问一下,当有好的libs实现时,为什么要使用vanilla JS吗?