0

私は 2 つの非同期操作を実行し、次に finalonResultonFaultdefined を実行しました。getConnection次の 2 つの非同期操作を連鎖させてselectから、最後にまたはを呼び出すにはどうすればよいですonResultonFault

編集は、次のシーケンスを約束するのに助けが必要です。

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

2 に答える 2

0

qのような promise ライブラリを使用している場合、promise を連鎖させる方法は次のとおりです。

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

また、共通の js promises 仕様を読むことをお勧めします

于 2014-12-09T22:06:15.557 に答える
0

いくつかのことを試した後、これはどのように行われるべきですか?レビューしてください

    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')
}
于 2014-12-09T21:24:49.267 に答える