将带有回调的约定 node.js 函数转换为生成器和 yield
converting convention node.js function with callback to generators and yield
我是 koa.js 的新手,非常喜欢它,用它开始了一个项目。我需要使用 twilio 发送短信。
对 twilio 包的大多数调用都遵循此结构。
public.get('/najam', function *(){
this.body = "hello from najam";
//yeild before c.sendSms or inside callback?
c.sendSms({
to:'YOUR_PHONE',
}, function(e, m) {
if (!e) {
//yeild here?
}
});
});
我如何修改它以将其放入生成器函数中以及在什么时候我将使用 yield 关键字?
如果您的回答建议使用 Co 库,请向我提供带有代码和位解释的示例。
只需使用 Promise 包装基于回调的接口,以便您可以在路由中产生它。
function sendSms(toPhone, textMessage) {
return new Promise(function(resolve, reject) {
c.sendSms({ to: toPhone, message: textMessage }, function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
现在你可以在路线内让路了。如果它抛出错误
(比如网络中断),然后 Koa 的默认错误处理程序将
抓住它并将其变成 500 错误。
public.get('/najam', function *(){
this.body = "hello from najam";
yield sendSms('YOUR_PHONE', 'SOME_MESSAGE');
});
或者如果您想以某种特定方式处理错误,您可以自己try/catch:
public.get('/najam', function *(){
this.body = "hello from najam";
var result;
try {
result = yield sendSms('YOUR_PHONE', 'SOME_MESSAGE');
} catch(err) {
// Maybe we just wanna log the error to a server before rethrowing
// it so Koa can handle it
logError(err);
throw err;
}
});
当用 Promise 包装一些东西时,只需在出现错误时调用 reject(err)
并在成功完成时调用 resolve(result)
。
我刚刚发现了如何在没有承诺的情况下做到这一点。它非常酷,代码最少且没有外部库。归功于:Josef Sima
function sendSmsAsync(phone) {
return function(callback) {
c.sendSms({to: phone}, callback);
}
}
yield sendSmsAsync("5551212");
这个小片段将任何使用节点回调的函数转换为生成器。您也可以将 sendSmsAsync 调用包装在 try..catch 中。并且不要忘记在节点中设置 --harmony 选项。
我是 koa.js 的新手,非常喜欢它,用它开始了一个项目。我需要使用 twilio 发送短信。
对 twilio 包的大多数调用都遵循此结构。
public.get('/najam', function *(){
this.body = "hello from najam";
//yeild before c.sendSms or inside callback?
c.sendSms({
to:'YOUR_PHONE',
}, function(e, m) {
if (!e) {
//yeild here?
}
});
});
我如何修改它以将其放入生成器函数中以及在什么时候我将使用 yield 关键字?
如果您的回答建议使用 Co 库,请向我提供带有代码和位解释的示例。
只需使用 Promise 包装基于回调的接口,以便您可以在路由中产生它。
function sendSms(toPhone, textMessage) {
return new Promise(function(resolve, reject) {
c.sendSms({ to: toPhone, message: textMessage }, function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
现在你可以在路线内让路了。如果它抛出错误 (比如网络中断),然后 Koa 的默认错误处理程序将 抓住它并将其变成 500 错误。
public.get('/najam', function *(){
this.body = "hello from najam";
yield sendSms('YOUR_PHONE', 'SOME_MESSAGE');
});
或者如果您想以某种特定方式处理错误,您可以自己try/catch:
public.get('/najam', function *(){
this.body = "hello from najam";
var result;
try {
result = yield sendSms('YOUR_PHONE', 'SOME_MESSAGE');
} catch(err) {
// Maybe we just wanna log the error to a server before rethrowing
// it so Koa can handle it
logError(err);
throw err;
}
});
当用 Promise 包装一些东西时,只需在出现错误时调用 reject(err)
并在成功完成时调用 resolve(result)
。
我刚刚发现了如何在没有承诺的情况下做到这一点。它非常酷,代码最少且没有外部库。归功于:Josef Sima
function sendSmsAsync(phone) {
return function(callback) {
c.sendSms({to: phone}, callback);
}
}
yield sendSmsAsync("5551212");
这个小片段将任何使用节点回调的函数转换为生成器。您也可以将 sendSmsAsync 调用包装在 try..catch 中。并且不要忘记在节点中设置 --harmony 选项。