UPDATE
顯然我沒有正確讀取的問題,這裏是2的工作示例被使用promisified的RESTify JSON客戶端。你只需在第二次傳播的內容中爲你的帖子做另一次傳播。
var promise = require('bluebird');
var restify = require('restify');
promise.promisifyAll(restify.JsonClient.prototype);
var client = restify.createJsonClient({
url: 'http://localhost:8080',
version: '*'
});
client.getAsync('/api/resource/1').spread(function(req, res, obj) {
console.log('result 1', obj);
return client.getAsync('/api/resource/2').spread(function(req, res, obj) {
console.log('result 2', obj);
});
});
正如我在我的評論中指出的那樣,我不會讓自己滿意。相反,我會使用一個處理程序的身體執行承諾代碼或一個處理程序鏈(它也可以在體內承諾)。 restify應該只接收請求並執行處理程序。
我將使用restify頁面中基本示例的修改版本來說明每個。
承諾在郵件正文中使用knex.js它返回一個承諾
var knex = require('knex')(connectionConfig);
var restify = require('restify');
function promisePost(req, res, next) {
// get 1
knex.select('*')
.from('table1')
.where('id', '=', req.body.table1_id)
.then(function(result1) {
// get 2
return knex.select('*')
.from('table2')
.where('id', '=', req.body.table2_id)
.then(function(result2) {
return knex('table3').insert({
table1_value: result1.value,
table2_value: result2.value
})
.then(function(result3) {
res.send(result3);
return next();
});
});
});
}
var server = restify.createServer();
server.use(restify.bodyParser());
server.post('/myroute', promisePost);
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
現在鏈結的處理程序
var knex = require('knex')(connectionConfig);
var restify = require('restify');
function get1(req, res, next) {
knex.select('*').from('table1')
.where('id', '=', req.body.table1_id)
.then(function(result1) {
res.locals.result1 = result1;
return next();
});
}
function get2(req, res, next) {
knex.select('*').from('table2')
.where('id', '=', req.body.table2_id)
.then(function(result2) {
res.locals.result2 = result2;
return next();
});
}
function post(req, res, next) {
knex('table3').insert({
table1_value: res.locals.result1,
table2_value: res.locals.result2
})
.then(function(result3) {
res.send(result3);
return next();
});
}
var server = restify.createServer();
server.use(restify.bodyParser());
server.post('/myroute', get1, get2, post);
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
應該有一個錯誤,你不得到任何? – Bergi
創建客戶端應該是同步的。獲取路徑響應應該是異步的。 – Bergi
我不認爲你應該promisify restify。您可以在處理程序中提供代碼,或者您可以鏈接處理程序並在每個處理程序上調用以移至下一個處理程序 – vbranden