用同步代码模拟异步承诺的蓝鸟模式
bluebird pattern for mocking asynchronous promises with syncronous code
我刚刚开始使用 bluebird(更普遍的是 node)。
我想创建一些模拟(最终将是 http 或数据库调用)。
所有关于反模式的话题都让我焦虑:-)
那么,将此同步代码转换为 promise 是否是一种合理的方法?
我这里有两个简单的函数。第二个调用第一个(不是 prod 服务的方式)但它作为嵌套承诺的例证。
// mock function to return a promise of a collection
var getTestPatients = function(params) {
return new Promise(function(resolve, reject) {
setTimeout(function() {resolve(test_patients);}, 200);
})
};
// mock function to return a promise of an object
var getTestPatient = function(params) {
return getTestPatients().then(function(patients) {
// wouldnt get entire patient list in prod - but this works for a mock
var patient = _.find(patients, {urn: params.urn});
if (patient) {
patient.reviews = testReviews(params.uid);
}
else {
throw new Error('patient not found');
}
return Promise.resolve(patient);
});
};
这些证明了一些事情:
- 制造假延迟
- 从同步代码创建承诺
- 在做出承诺的函数中操纵承诺结果
- 抛出错误
很多事情我都可能弄错了。
我的表现如何?这里有反模式吗?还是其他菜鸟错误?
这里没有反模式,也没有错误。但是,您可以改进两件事:
每当您发现自己在使用 Promise
构造函数时,请首先尝试找到更简单的方法。是否已经有一个函数可以 return 承诺完成所需的任务? setTimeout
是真正的基于回调的 API,所以这里没有 错误 ,但鉴于您使用的是 Bluebird,您可以通过使用 Promise.delay
辅助函数:
function getTestPatients = function(params) {
return Promise.delay(test_patients, 200);
}
在 then
处理程序中调用 Promise.resolve
是不必要的。正如您可以 throw
异常一样,您可以 return
普通值,它们将被自动换行。所以看起来更干净只是
return patient;
我刚刚开始使用 bluebird(更普遍的是 node)。
我想创建一些模拟(最终将是 http 或数据库调用)。
所有关于反模式的话题都让我焦虑:-)
那么,将此同步代码转换为 promise 是否是一种合理的方法?
我这里有两个简单的函数。第二个调用第一个(不是 prod 服务的方式)但它作为嵌套承诺的例证。
// mock function to return a promise of a collection
var getTestPatients = function(params) {
return new Promise(function(resolve, reject) {
setTimeout(function() {resolve(test_patients);}, 200);
})
};
// mock function to return a promise of an object
var getTestPatient = function(params) {
return getTestPatients().then(function(patients) {
// wouldnt get entire patient list in prod - but this works for a mock
var patient = _.find(patients, {urn: params.urn});
if (patient) {
patient.reviews = testReviews(params.uid);
}
else {
throw new Error('patient not found');
}
return Promise.resolve(patient);
});
};
这些证明了一些事情:
- 制造假延迟
- 从同步代码创建承诺
- 在做出承诺的函数中操纵承诺结果
- 抛出错误
很多事情我都可能弄错了。
我的表现如何?这里有反模式吗?还是其他菜鸟错误?
这里没有反模式,也没有错误。但是,您可以改进两件事:
每当您发现自己在使用
Promise
构造函数时,请首先尝试找到更简单的方法。是否已经有一个函数可以 return 承诺完成所需的任务?setTimeout
是真正的基于回调的 API,所以这里没有 错误 ,但鉴于您使用的是 Bluebird,您可以通过使用Promise.delay
辅助函数:function getTestPatients = function(params) { return Promise.delay(test_patients, 200); }
在
then
处理程序中调用Promise.resolve
是不必要的。正如您可以throw
异常一样,您可以return
普通值,它们将被自动换行。所以看起来更干净只是return patient;