节点上的javascript附加多个被调用的函数

时间:2017-03-02 17:50:35

标签: javascript angularjs node.js

在angular中,有一个选项可以调用$ http服务并附加回调以获得成功和错误:

$http.get(url).success (function() { do A}).error (function () { do B});

我想在javascript over node上实现它,所以我创建了新文件并编写了下面的代码

file1.js:

module.exports = 
{ 


    get: function (url) {
        //should be sync implementation
        console.log("get function");
    },

    error: function (url) {

        console.log("error function");
    },

    success: function (url) {

        console.log("success function");
    }
}

来自file2:

var global = require('./file1');
file1.get("some string")
     .success( function () { console.log("success") })
     .error( function () { console.log("success") })

然后我用jasmine_nodejs插件从grunt运行它。 但这不起作用。如何定义具有可附加功能的模块?

3 个答案:

答案 0 :(得分:0)

该函数必须返回一个具有其他函数的对象,然后您可以将其链接。例如。如果get函数返回{ foo: function() { ... } },则可以按以下方式将其链接get().foo()

Angular使用promises来获取http请求,因为这些是异步操作。

答案 1 :(得分:0)

$http服务正在执行异步操作,语法基于名为Promises的概念。

让我们看一下您的示例,并将其转换为基于Promise的模块。

module.exports = {
    get: function(url) {
        return new Promise(function(resolve, reject) {
            // Perform your operation here.
            // ...
            // After your operation, depending on the status of your object,
            // you want to call either resolve or reject.
            setTimeout(function() {
                resolve("Success!");
                // or you can call reject("Fail!");
            }, 250);
        })
    }
}

现在,您应该可以这样做:

var file1 = require('./file1');
file.get("some string")
     .then( function () { console.log("success") })
     .catch( function () { console.log("error!") })

请记住,当您调用resolve(...)函数时,它将使用参数触发.then方法。反之,当您致电reject(...)时,它会触发.catch功能。

答案 2 :(得分:0)

让每个函数都返回:

module.exports = {
    get: function (url) {
        //should be sync implementation
        console.log("get function");
        return this;
    },
    error: function (url) {
        console.log("error function");
        return this;
    },
    success: function (url) {
        console.log("success function");
        return this;
    }
}

这将允许你链。但我强烈建议您使用框架来做到这一点。