如何在链中进行http调用api
我的要求是创建帐户
我必须关注事件
1检查帐户是否存在 2如果帐户不存在,则表示我已创建帐户
帐户是否存在 我写了一个功能搜索(帐户名称是唯一的)
Account.search({"name":"username"})
它使用“用户名”检索帐户名称 如果没有找到我正在调用Account.save()
Account.da.js
exports.search = function (query) {
var deferred = Q.defer();
request({
url: config.ctxDa.url + "/account/search",
method: "GET",
qs: query,
useQuerystring: true,
headers: {"Content Type": "application/json"}
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
deferred.resolve(body);
}
else {
deferred.reject(error);
}
});
return deferred.promise;
};
//用于创建帐户
exports.save = function (newAccount) {
var deferred = Q.defer();
request({
url: config.ctxDa.url + "/account",
method: "POST",
headers: {"Content Type": "application/json"},
json: newAccount
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
deferred.resolve(body);
}
else {
deferred.reject(error);
}
});
return deferred.promise;
};
这是我创建帐户的实用程序功能
exports.createAccount = function (account) {
var deferred = Q.defer();
Account.search({name: account.name}).then(function (body) {
if (JSON.parse(body).length == 0)
return;
return throw new Error("account already exists");
}).then(function () {
return Account.save(account).then(function (body) {
return deferred.resolve(body);
}, function (error) {
throw error;
})
}).catch(function (error) {
deferred.reject(error);
})
.done();
return deferred.promise;
}
以链式顺序调用http调用的最佳做法是什么
答案 0 :(得分:1)
您的逻辑应该有效,尽管您不需要在createAccount
函数中创建新的promise对象。因为Account.search
和Account.save
都返回了promises,你可以将它们链接起来并返回结果:
exports.createAccount = function(account) {
return Account.search({name: account.name}).then(function(body) {
if (JSON.parse(body).length === 0) {
return;
}
// (you don’t need to `return`; `throw` by itself is enough)
throw new Error('account already exists');
}).then(function() {
return Account.save(account);
});
}
当您使用then()
函数链将promises链接在一起时,链的最后一步的返回值将返回给调用者。这就是我们return Account.search(…)
的原因。它最终会从then()
函数链中返回最终的承诺。如果出现错误,或者Account.save
已解决的承诺(这是最终then()
函数返回的内容),它将被拒绝承诺。
我们跳过catch
函数,因为您只是将任何错误传递给链。如果有错误,它将被传递给createAccount
的来电者,他们有责任处理它。
改进此代码的另一种方法是处理JSON.parse
函数中的Account.search
。它应该返回解析后的结果,而不是返回正文,因此您不必在createAccount
函数中(或者您可以调用Account.search
的任何其他函数)执行此操作。而且我不确定Account.save
返回什么,但看起来也可以在返回之前进行解析。