【问题标题】:Javascript Asynchronous OrderJavascript 异步订单
【发布时间】:2015-09-15 05:39:48
【问题描述】:

我的问题是针对 Javascript 和异步操作的。我正在构建一个用于与数据库 (OrientDB) 交互的 Node.js API,并且我正在使用一个面向 Node 的包来提供基本的连接功能。其中一些函数如下所示:

db.delete("...")
db.insert("...")
etc.

他们每个人都返回一个可用于对结果采取行动的承诺:

db.insert("...").then(function(records) {
    res.send(records);
});

我的目标是执行两个删除语句(顺序无关紧要),然后执行一个插入语句(必须在删除语句之后发生,否则我最终会删除插入的记录)。我可以简单地写以下内容吗:

db.delete("...");
db.delete("...");
db.insert("...");

换句话说,像Javascript这样的单线程环境中的异步操作的顺序是否保持不变??? 还是我需要做出某种承诺:

var promise = new Promise(function(resolve, reject) {

    db.delete("thing to delete").then(handleFinish, reject);
    db.delete("other thing to delete").then(handleFinish, reject);

    var finished = false;

    function handleFinish() {
        if(finished){
            resolve();
        }
        else {
            finished = true;
        }
    }
});

然后

promise.then(function(){
    db.insert("...");
});

或者有更好的选择来完成这个吗?我是 Node 新手,也是异步编程新手。

【问题讨论】:

  • 这主要取决于您正在使用的db 实现。异步只是意味着他们在 JS 继续执行时做后台工作,而不是他们搞乱了他们的顺序。

标签: javascript node.js asynchronous


【解决方案1】:

这可以通过存在许多模块的 promises 来实现。这是promise的示例

var Promise = require('promise');

Promise.all([
  db.delete(...),
  db.delete(...)
]).then(function(result) {
  db.insert(...);
});

在处理回调时,可以使用控制流模块,例如async

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2019-01-20
    • 2018-12-03
    相关资源
    最近更新 更多