在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运行它。
但这不起作用。如何定义具有可附加功能的模块?
答案 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;
}
}
这将允许你链。但我强烈建议您使用框架来做到这一点。